大的数据过了,小的数据WA了
//2025-01-08 08:49:43
#include<bits/stdc++.h>
#define db double
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define mkp make_pair
#define pii pair<int,int>
using namespace std;
bool MBE;
inline int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int mxn=2e5+10;
bool tree1[mxn<<2];
int cnt,tot,dep[mxn],id[mxn],siz[mxn],dfn[mxn],id2[mxn],m,n,a[mxn],tag[mxn<<2],b[mxn];
queue<int>q;
vector<int>E[mxn];
set<int>st[mxn],s[mxn];
void dfs(int u,int f){
dep[u]=dep[f]+1;
dfn[u]=++tot,id[tot]=u;
siz[u]=1;
for(int v:E[u]){
dfs(v,u);
siz[u]+=siz[v];
}
}
bool query1(int o,int l,int r,int L,int R){
if(L<=l&&r<=R)return tree1[o];
int mid=(l+r)>>1;bool res=0;
if(L<=mid)res|=query1(o*2,l,mid,L,R);
if(R>mid)res|=query1(o*2+1,mid+1,r,L,R);
return res;
}
void update1(int o,int l,int r,int pos){
if(l==r){
tree1[o]=1;
return;
}
int mid=(l+r)>>1;
if(pos<=mid)update1(o*2,l,mid,pos);
else update1(o*2+1,mid+1,r,pos);
tree1[o]=1;
}
void change(int o,int x){
tag[o]=max(tag[o],x);
}
int query2(int o,int l,int r,int pos){
if(l==r)return tag[o];
int mid=(l+r)>>1;
if(pos<=mid)return max(tag[o],query2(o*2,l,mid,pos));
else return max(tag[o],query2(o*2+1,mid+1,r,pos));
}
void update2(int o,int l,int r,int L,int R,int val){
if(L<=l&&r<=R){
tag[o]=max(tag[o],val);
return;
}
int mid=(l+r)>>1;
if(L<=mid)update2(o*2,l,mid,L,R,val);
if(R>mid)update2(o*2+1,mid+1,r,L,R,val);
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
n=read();
for(int i=2;i<=n;i++){
int x=read();
E[x].eb(i);
}
q.push(1);
while(!q.empty()){
int u=q.front();q.pop();
a[u]=++tot;id2[tot]=u;
for(int v:E[u])
q.push(v);
}
tot=0;
dfs(1,0);
for(int i=1;i<=n;i++)
st[dep[i]].insert(dfn[i]);
m=read();
for(int i=1;i<=m;i++){
int u=read(),k=read();
int d=dep[u]+k;
auto it=st[d].upper_bound(dfn[u]);
int l=*it;
it=st[d].upper_bound(dfn[u]+siz[u]-1);
it--;
int r=*it;
l=a[id[l]],r=a[id[r]];
if(query1(1,1,n,l,r))continue;
update1(1,1,n,l),update1(1,1,n,r);
cnt++;
for(int j=l;j<=r;j++)
s[cnt].insert(id2[j]);
}
int mn=n;
for(int i=1;i<=cnt;i++){
int las=1,mx=0;
for(int j:s[i]){
mx=max(mx,j);
update2(1,1,n,las,j,j);
las=j+1;
}
mn=min(mn,mx);
}
int res=n+1,resl=0;
for(int i=1;i<=mn;i++){
int p=query2(1,1,n,i);
if(p-i+1<res)res=p-i+1,resl=i;
}
printf("%d %d\n",resl,res+resl-1);
bool MED;
cerr<<(&MED-&MBE)/1048576.0<<" MB, "<<1000*clock()/CLOCKS_PER_SEC<<" ms\n";
return 0;
}