#include #define maxn 100010 using namespace std; int read() { int x=0,f=1; char ch=getchar(); while(ch-'0'<0||ch-'0'>9){if(ch=='-') f=-1;ch=getchar();} while(ch-'0'>=0&&ch-'0'<=9){x=x*10+ch-'0';ch=getchar();} return x*f; } int T; int n; int head[maxn],to[maxn*2],nxt[maxn*2],tot; void add(int u,int v) { tot++; nxt[tot]=head[u]; head[u]=tot; to[tot]=v; } int fa[maxn]; int t[maxn*40],ls[maxn*40],rs[maxn*40],cnt; void update(int k) { t[k]=t[ls[k]]+t[rs[k]]; } void modi(int &k,int l,int r,int x) { if(!k) k=++cnt; if(l==r) { t[k]=1; return; } int mid=(l+r)/2; if(mid>=x) modi(ls[k],l,mid,x); else modi(rs[k],mid+1,r,x); update(k); } int up[maxn][22],dep[maxn]; int rt[maxn]; void dfs(int x,int las) { for(int i=head[x];i;i=nxt[i]) { if(to[i]==las) continue; dep[to[i]]=dep[x]+1; up[to[i]][0]=x; dfs(to[i],x); } } int merge(int x,int y) { if(!x||!y) return x+y; ls[x]=merge(ls[x],ls[y]); rs[x]=merge(rs[x],rs[y]); t[x]+=t[y]; return x; } void find(int x,int las,int f) { if(fa[x]==x) fa[x]=f; for(int i=head[x];i;i=nxt[i]) { if(to[i]==las) continue; if(fa[to[i]]==to[i]) { find(to[i],x,f); rt[x]=merge(rt[x],rt[to[i]]); } } } int find(int x) { if(fa[x]==x) return x; return fa[x]=find(fa[x]); } int query(int k,int l,int r,int x) { if(l==r) return 1; int mid=(l+r)/2; if(mid>=x) return t[rs[k]]+query(ls[k],l,mid,x); return query(rs[k],mid+1,r,x); } int get_dis(int x,int y) { int res=0; if(dep[x]=0;i--) { if(dep[y]+(1<=0;i--) { if(up[x][i]!=up[y][i]) { res+=(1<