#include #include #include using namespace std ; vector> edges, parents ; vector depth, stack, parent, checklca ; vector> nontree, check ; void dfs(int a) { for (auto b: edges[a]) if (parent[b] == a) { stack.push_back(a) ; for (int d=1; d<=(int)stack.size(); d += d) parents[b].push_back(stack[stack.size()-d]) ; dfs(b) ; stack.pop_back() ; } else if (parent[a] != b) nontree.push_back({a,b}) ; } int lca(int a, int b, int bit) { if (a == b) return a ; bit = min(bit, (int)parents[a].size()-1) ; if (parents[a][bit] != parents[b][bit]) return lca(parents[a][bit], parents[b][bit], bit+1) ; else if (bit == 0) return parents[a][bit] ; else return lca(a, b, bit-1) ; } int lca(int a, int b) { if (depth[a] < depth[b]) swap(a, b) ; for (int d=depth[a]-depth[b]; d; d &= d-1) a = parents[a][ffs(d & - d)-1] ; return lca(a, b, 25) ; } int intsct(int a, int b, int ab, int c, int d, int cd) { int abcd = lca(ab, cd) ; return (abcd == cd && (lca(ab, c) == ab || lca(ab, d) == ab)) || (abcd == ab && (lca(cd, a) == cd || lca(cd, b) == cd)) ; } int npaths(int a, int b) ; int tryto(int a, int b, int c, int d) { int ab = lca(a, b) ; for (int i=0; i+1<(int)check.size(); i++) if (intsct(a, b, ab, check[i].first, check[i].second, checklca[i])) return 0 ; return npaths(c, d) ; } int npaths(int a, int b) { if (a < 0) return 1 ; int r = 0 ; for (auto p: nontree) { check.push_back({a,p.first}) ; checklca.push_back(lca(a,p.first)) ; r += tryto(a, p.first, p.second, b) ; checklca.pop_back() ; check.pop_back() ; } return r ; } int main(int argc, char *argv[]) { int n, nq ; cin >> n >> nq ; edges.resize(n) ; for (int i=0; i> a >> b ; a-- ; b-- ; edges[a].push_back(b) ; edges[b].push_back(a) ; } depth.resize(n) ; vector q ; depth[0] = 1 ; q.push_back(0) ; parent.resize(n) ; for (int qg=0; qg<(int)q.size(); qg++) { int a = q[qg] ; for (auto b: edges[a]) if (depth[b] == 0) { parent[b] = a ; depth[b] = depth[a] + 1 ; q.push_back(b) ; } } parents.resize(n) ; dfs(0) ; nontree.push_back({-1,-1}) ; for (int i=0; i> a >> b ; nontree[4].first = b-1 ; cout << npaths(a-1, b-1) << endl ; } }