#include using namespace std; typedef long long ll; templatebool chmax(T &a, const T &b) { if (abool chmin(T &a, const T &b) { if (b sz,in,out,nxt,par,depth; vector> G; HeavyLightDecomposition(){} HeavyLightDecomposition(int n_){ n=n_; sz.assign(n,0); in.assign(n,0); out.assign(n,0); nxt.assign(n,0); par.assign(n,0); depth.assign(n,0); G.assign(n,vector()); } void add_edge(int u,int v){ G[u].push_back(v); G[v].push_back(u); } void dfs_sz(int u,int p){ par[u]=p; sz[u]=1; if(G[u].size()&&G[u][0]==p) swap(G[u][0],G[u].back()); for(auto &a:G[u]){ if(a==p) continue; depth[a]=depth[u]+1; dfs_sz(a,u); sz[u]+=sz[a]; if(sz[a]>sz[G[u][0]]){ swap(a,G[u][0]); } } } void dfs_hld(int u,int p,int &t){ in[u]=t++; for(auto a:G[u]){ if(a==p) continue; nxt[a]=(a==G[u][0] ? nxt[u] : a); dfs_hld(a,u,t); } out[u]=t; } void build(int u){ int t=0; dfs_sz(u,-1); dfs_hld(u,-1,t); } int lca(int u,int v){ if(in[u]>in[v]) swap(u,v); if(nxt[u]==nxt[v]) return u; return lca(u,par[nxt[v]]); } int mov1(int a,int b){ if(a==b) return a; int c=lca(a,b); if(c==a){ int l=0,r=si(G[a]); while(r-l>1){ int m=(l+r)/2; if(par[a]==G[a][m]){ if(m+1>N>>Q; HeavyLightDecomposition hld(N); for(int i=0;i>a>>b;a--;b--; hld.add_edge(a,b); } hld.build(0); memset(par,-1,sizeof(par)); for(int i=0;i>a>>b;a--;b--; int c=hld.lca(a,b); int dis=hld.depth[a]+hld.depth[b]-2*hld.depth[c]; if(dis&1){ cout<<0<<"\n"; continue; } if(hld.depth[a]=0;t--){ if((dis/2)&(1<