#pragma comment(linker, "/STACK:102400000,102400000") #include #include #include using namespace std; #define ls (p<<1) #define rs (p<<1|1) #define NN 201000 int en[NN],fi[NN],te,ne[NN],v[NN]; int tp; int siz[NN],son[NN],top[NN],fa[NN],dep[NN],tid[NN],ran[NN]; void addedge(int a,int b){ ++te;ne[te]=fi[a];fi[a]=te;v[te]=b; ++te;ne[te]=fi[b];fi[b]=te;v[te]=a; } void dfs1(int u,int father,int d){ siz[u]=1; dep[u]=d; fa[u]=father; int e,vv; for(e=fi[u];e!=-1;e=ne[e]){ vv=v[e]; if (vv!=father){ dfs1(vv,u,d+1); siz[u]+=siz[vv]; if (son[u]==-1||siz[vv]>siz[son[u]]){ son[u]=vv; } } } } void dfs2(int u,int ttop){ top[u]=ttop; tid[u]=++tp; ran[tid[u]]=u; if (son[u]==-1) return; dfs2(son[u],ttop); int e,vv; for(e=fi[u];e!=-1;e=ne[e]){ vv=v[e]; if (vv!=fa[u]&&vv!=son[u]){ dfs2(vv,vv); } } } struct segtree{ int l,r,tag1,tag2,rev1,rev2; }t[NN*4]; inline void Rev(int p,int func){ if (func==1) {t[p].rev1^=1;t[p].tag1=t[p].r+1-t[p].l-t[p].tag1;} if (func==2) {t[p].rev2^=1;t[p].tag2^=1;} } void lazy(int p){ if (t[p].l==t[p].r) {t[p].rev1=t[p].rev2=0;return;} if (t[p].rev1!=0) { t[p].rev1=0; Rev(ls,1); Rev(rs,1); } if (t[p].rev2!=0) { t[p].rev2=0; Rev(ls,2); Rev(rs,2); } } void build(int l,int r,int p){ t[p].l=l;t[p].r=r; t[p].tag1=t[p].tag2=t[p].rev1=t[p].rev2=0; if (l==r){return;} int m=l+r>>1; build(l,m,ls); build(m+1,r,rs); } inline void update(int p){ t[p].tag1=t[ls].tag1+t[rs].tag1; } void rev(int l,int r,int func,int p){ if (l>r) return; if (t[p].l==l&&t[p].r==r){ Rev(p,func); return; } lazy(p); int m=t[p].l+t[p].r>>1; if (r<=m) rev(l,r,func,ls); else if (l>m) rev(l,r,func,rs); else { rev(l,m,func,ls); rev(m+1,r,func,rs); } update(p); } int query(int l,int r,int p){ if (l>r) return 0; if (t[p].l==l&&t[p].r==r){ return t[p].tag1; } lazy(p); int m=t[p].l+t[p].r>>1; if (r<=m) return query(l,r,ls); else if (l>m) return query(l,r,rs); else { return query(l,m,ls)+query(m+1,r,rs); } update(p); } int querytag2(int pos,int p){ if (t[p].l==t[p].r) return t[p].tag2; lazy(p); int m=t[p].l+t[p].r>>1; if (pos<=m) return querytag2(pos,ls); else return querytag2(pos,rs); update(p); } void linerev(int a,int b){ while(top[a]!=top[b]){ if (dep[top[a]]dep[b]) swap(a,b); rev(tid[a]+1,tid[b],1,1); } void linerevadj(int a,int b){ while(top[a]!=top[b]){ if (dep[top[a]]dep[b]) swap(a,b); rev(tid[a],tid[b],2,1); int faa=fa[a]; if (faa!=0&&son[faa]==a) rev(tid[a],tid[a],1,1); if (son[b]!=-1) rev(tid[son[b]],tid[son[b]],1,1); } int linequery(int a,int b){ int ret=0; while(top[a]!=top[b]){ if (dep[top[a]]dep[b]) swap(a,b); ret+=query(tid[a]+1,tid[b],1); return ret; } int main(){ int cas,n,q,i,a,b,c; scanf("%d",&cas); while(cas--){ scanf("%d",&n); memset(fi,-1,sizeof(fi)); te=0; for(i=1;i