#include #include #include #include #include #include using namespace std; long long readInt(long long l,long long r,char endd){ long long x=0; int cnt=0; int fi=-1; bool is_neg=false; while(true){ char g=getchar(); if(g=='-'){ assert(fi==-1); is_neg=true; continue; } if('0'<=g && g<='9'){ x*=10; x+=g-'0'; if(cnt==0){ fi=g-'0'; } cnt++; assert(fi!=0 || cnt==1); assert(fi!=0 || is_neg==false); assert(!(cnt>19 || ( cnt==19 && fi>1) )); } else if(g==endd){ assert(cnt>0); if(is_neg){ x= -x; } assert(l<=x && x<=r); return x; } else { assert(false); } } } string readString(int l,int r,char endd){ string ret=""; int cnt=0; while(true){ char g=getchar(); assert(g!=-1); if(g==endd){ break; } cnt++; ret+=g; } assert(l<=cnt && cnt<=r); return ret; } long long readIntSp(long long l,long long r){ return readInt(l,r,' '); } long long readIntLn(long long l,long long r){ return readInt(l,r,'\n'); } string readStringLn(int l,int r){ return readString(l,r,'\n'); } string readStringSp(int l,int r){ return readString(l,r,' '); } int T; int n,sm_n=0; int L[200200]; int R[200200]; int rng[200200][2]; set g; int mx_l,sol=0; bool dfs(int nd){ if(L[nd] == -1)return true; if(!dfs(L[nd]))return false; if(!dfs(R[nd]))return false; if(rng[L[nd]][1] + 1 == rng[R[nd]][0]){ rng[nd][0] = rng[L[nd]][0]; rng[nd][1] = rng[R[nd]][1]; } else if(rng[R[nd]][1] + 1 == rng[L[nd]][0]) { sol++; rng[nd][0] = rng[R[nd]][0]; rng[nd][1] = rng[L[nd]][1]; } else { return false; } return true; } int main(){ T=readIntLn(1,1000); while(T--){ mx_l=0; g.clear(); n=readIntLn(2,200000); sm_n += n; sol=0; assert(sm_n<=200000); for(int i=1;i<=n;i++){ int a,b; a=readIntSp(-1,n); b=readIntLn(1,n); if(a == -1){ mx_l=max(mx_l,b); assert(!g.count(b)); g.insert(b); L[i] = R[i] = -1; rng[i][0] = rng[i][1] = b; } else { assert(a != 0); L[i]=a; R[i]=b; } } assert(g.size() == mx_l); if(dfs(1)){ cout<