#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; const ll INF=1LL<<60; typedef pair P; typedef pair PP; const ll MOD=998244353; int main(){ int N; cin>>N; vector> G(N+1); vector indeg(N+1,0); vector L(N+1),A(N+1); vector requiredlevel(N+1); for(int i=2;i<=N;i++){ cin>>L[i]>>A[i]; //state[L[i]].emplace_back(A[i],i); G[A[i]].push_back(i);//A[i]からiに辺をはる indeg[i]++; requiredlevel[i]=L[i]; } priority_queue,greater

> pq; for(int to:G[1]){ indeg[to]--; if(indeg[to]==0){ pq.emplace(requiredlevel[to],to); } } map minlevel; vector islearned(N+1,false); int nowlev=0; while(!pq.empty()){ auto [lev,id]=pq.top(); pq.pop(); if(islearned[id]) continue; if(nowlev cnt; for(auto [id,lev]:minlevel){ cnt[lev]++;//levのレベルでidの技を覚えられる } vector> ansq1; ansq1.emplace_back(0,1); int cntsum=1; for(auto [lev,num]:cnt){ cntsum+=num; ansq1.emplace_back(lev,cntsum); } int Q; cin>>Q; vector ans(Q); int t,x,y; for(int q=0;q>t; if(t==1){ cin>>x;//レベルx auto it=upper_bound(ansq1.begin(),ansq1.end(),make_pair(x+1,-1)); if(it==ansq1.begin()){ ans[q]=-1; }else{ it--; ans[q]=it->second; } }else{ cin>>y; ans[q] =(minlevel.count(y)?minlevel[y]:-1); } } for(auto v:ans){ cout<