#include #define mid ((l+r)>>1) using namespace std; struct edge{ int to,next; }e[200005]; struct tree{ int l,r,s; }t[8000005]; int test; int n,m,cnt,c[400005],dfn[100005],ed[100005],deep[100005],head[100005],root[100005]; int size[100005],Fa[100005],top[100005],son[100005]; void add(int u,int v){ e[++cnt]=(edge){v,head[u]}; head[u]=cnt; } void dfs(int rt,int fa){ dfn[rt]=++cnt;size[rt]=1;Fa[rt]=fa;son[rt]=0; for(int i=head[rt];i;i=e[i].next)if(e[i].to!=fa){ deep[e[i].to]=deep[rt]+1; dfs(e[i].to,rt); size[rt]+=size[e[i].to]; if(size[e[i].to]>size[son[rt]])son[rt]=e[i].to; } ed[rt]=cnt; } void Dfs(int rt,int fa){ for(int i=head[rt];i;i=e[i].next)if(e[i].to!=fa){ if(e[i].to!=son[rt])top[e[i].to]=e[i].to; else top[e[i].to]=top[rt]; Dfs(e[i].to,rt); } } inline void merge(int &rt,int Rt){ if(rt==0){rt=Rt;return;} if(Rt==0)return; int tmp=++cnt; t[tmp].l=t[rt].l;merge(t[tmp].l,t[Rt].l); t[tmp].r=t[rt].r;merge(t[tmp].r,t[Rt].r); t[tmp].s=t[rt].s+t[Rt].s; rt=tmp; } inline int get(int l,int r,int k){ int tmp=++cnt; t[tmp].s=1; t[tmp].l=t[tmp].r=0; if(l==r)return tmp; if(k<=mid)t[tmp].l=get(l,mid,k); else t[tmp].r=get(mid+1,r,k); return tmp; } void build(int rt,int fa){ root[rt]=get(1,n,rt); for(int i=head[rt];i;i=e[i].next)if(e[i].to!=fa){ build(e[i].to,rt); merge(root[rt],root[e[i].to]); } } #define lson index<<1 #define rson index<<1|1 void cover(int l,int r,int L,int R,int C,int index){ if((L<=l)&&(R>=r)){c[index]=C;return;} if(L<=mid)cover(l,mid,L,R,C,lson); if(R>mid)cover(mid+1,r,L,R,C,rson); } inline int f(int x,int y){return deep[x]0?x:-x;} inline querys(int l,int r,int L,int R,int rt){ if(rt==0)return 0; if((L<=l)&&(R>=r))return t[rt].s; int ans=0; if(L<=mid)ans+=querys(l,mid,L,R,t[rt].l); if(R>mid)ans+=querys(mid+1,r,L,R,t[rt].r); return ans; } inline int getr(int x,int rt){return querys(1,n,x,n,root[rt])-1;} inline int lca(int u,int v){ int U=top[u],V=top[v]; while(U!=V){ if(deep[U]>deep[V])u=Fa[U],U=top[u]; else v=Fa[V],V=top[v]; } return f(u,v); } inline int dis(int x,int y){return deep[x]+deep[y]-2*deep[lca(x,y)];} void Clear(int l,int r,int index){ c[index]=0; if(l==r)return; Clear(l,mid,lson); Clear(mid+1,r,rson); } void clear(){ for(int i=1;i<=n;i++)head[i]=0; Clear(1,n,1); } /* 5 5 1 2 1 4 2 3 2 5 10 1 4 2 1 4 */ int main(){ scanf("%d",&test); deep[0]=100000000; while(test--){ scanf("%d",&n);cnt=0; clear(); for(int i=1;i