#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,' '); } const int MX = (1<<20) , MXL = 20; typedef long long ll; int par[MXL][MX] , T , n , QN; vector < int > v[MX]; int val[MX] , mx[MX] , change[MX]; void dfs(int x , int p){ for(auto nxt : v[x]){ if(nxt == p) continue; par[0][nxt] = x; mx[nxt ] = max(mx[x] , val[nxt]); change[nxt] = change[x]; if(mx[x] < val[nxt]) ++change[nxt]; dfs(nxt , x); } } int maxVal = 100000000; int minVal = 1; int main(){ T = readIntLn(1 , 1000); //assert(1 <= T && T <= 1000); mx[0] = minVal; int sumn = 0 , sumq = 0; while(T--){ n = readIntLn(2 , 1000000); sumn += n; //assert(n >= 2 && n <= 1000000); for(int j = 1 ; j <= n ; j++) v[j].clear(); for(int j = 0 ; j < MXL ; j++) for(int i = 1 ; i <= n ; i++) par[j][i] = 0; for(int j = 1 ; j <= n ; j++){ if(j == n) val[j] = readIntLn(minVal , maxVal); else val[j] = readIntSp(minVal , maxVal); //assert(minVal <= val[j]); //assert(val[j] <= maxVal); } for(int j = 2 ; j <= n ; j++){ int a = j , b; if(j == n) b = readIntLn(1 , a - 1); else b = readIntSp(1 , a - 1); //b = readInt(1 , a - 1); //scanf("%d",&b); //assert(1 <= b && b <= a - 1); v[a].push_back(b); v[b].push_back(a); } //scanf("%d",&QN); QN = readIntLn(1 , 1000000); sumq += QN; //assert(1 <= QN && QN <= 1000000); int lastans = 0; change[1] = 1; mx[1] = val[1]; dfs(1 , -1); for(int j = 1 ; j < MXL ; j++){ for(int i = 1 ; i <= n ; i++){ par[j][i] = par[j-1][par[j-1][i]]; // dp[j][i] = max(dp[j-1][i] , dp[j-1][par[j-1][i]]); } } while(QN--){ int node , V; node = readIntSp(INT_MIN , INT_MAX); V = readIntLn(INT_MIN , INT_MAX); node ^= lastans , V ^= lastans; assert(1 <= node && node <= n); assert(minVal <= V && V <= maxVal); if(mx[node] <= V){ puts("0"); lastans = 0; continue; } if(V < val[1]){ printf("%d\n",change[node]); lastans = change[node]; continue; } int tar = node; for(int bit = MXL - 1 ; bit >= 0 ; bit--){ if(mx[par[bit][tar]] > V) tar = par[bit][tar]; } tar = par[0][tar]; lastans = change[node] - change[tar]; printf("%d\n",lastans); } } assert(sumn <= 1000000); assert(sumq <= 1000000); }