1 #include<bits/stdc++.h>
2 #define rep(i,l,r) for(int i=l;i<=r;++i)
3 using namespace std;
4 const int N=202333;
5 int dep[N],sz[N],size,tot,son[N],top[N],fa[N],begin[N],end[N],head[N],ans[N][2],c,n,m,x,cnt,t[N];
6 struct zs{
7 int a,b,c,pos,opt;
8 }a[N];
9 struct node{
10 int next,to;
11 }e[N<<1];
12 inline void ins(int u,int v) {
13 e[++tot].to=v; e[tot].next=head[u]; head[u]=tot;
14 }
15 inline void dfs1(int x,int pre) {
16 dep[x]=dep[fa[x]=pre]+1; sz[x]=1;
17 for(int k=head[x];k;k=e[k].next) {
18 if(e[k].to==pre) continue;
19 dfs1(e[k].to,x);
20 sz[x]+=sz[e[k].to];
21 if(sz[e[k].to]>sz[son[x]]) son[x]=e[k].to;
22 }
23 }
24 void dfs2(int x,int tr) {
25 top[x]=tr;
26 if(son[x]) dfs2(son[x],tr);
27 for(int k=head[x];k;k=e[k].next) {
28 if(e[k].to==fa[x] || e[k].to==son[x]) continue;
29 dfs2(e[k].to,e[k].to);
30 }
31 }
32 inline int lca(int x,int y) {
33 int a,b;
34 a=top[x]; b=top[y];
35 while(a!=b) {
36 if(dep[a]<dep[b]) swap(a,b),swap(x,y);
37 x=fa[a]; a=top[x];
38 }
39 if(dep[x]<dep[y]) return x;else return y;
40 }
41 void dfs(int x){
42 begin[x]=++cnt;
43 for(int k=head[x];k;k=e[k].next) dfs(e[k].to);
44 end[x]=cnt;
45 }
46 bool cmp(zs a,zs b){
47 return a.c==b.c?a.opt<b.opt:a.c<b.c;
48 }
49 inline void add(int x,int k){
50 while(x<=n) t[x]+=k,x+=x&-x;
51 }
52 inline int ask(int x){
53 int sum=0;
54 while(x) sum+=t[x],x-=x&-x;
55 return sum;
56 }
57 inline int read(){
58 int x=0,c=getchar();
59 while(c<‘0‘||c>‘9‘) c=getchar();
60 while(c>=‘0‘&&c<=‘9‘) x=x*10+c-48,c=getchar();
61 return x;
62 }
63 int main(){
64 scanf("%d",&n);
65 rep(i,1,n) {x=read(); if(x)ins(x,i);}
66 dfs(1);
67 dfs1(1,0);
68 dfs2(1,1);
69 scanf("%d",&m);
70 rep(i,1,m){
71 a[i].opt=read();
72 if(a[i].opt==1){
73 a[i].a=read(); a[i].b=read(); a[i].c=read();
74 a[i].pos=++size;
75 a[i].c=i-a[i].c;
76 }else a[i].a=read(),a[i].c=i;
77 }
78 sort(a+1,a+1+m,cmp);
79 rep(i,1,m)if(a[i].opt==2){
80 add(begin[a[i].a],1); add(end[a[i].a]+1,-1);
81 }else {
82 c=lca(a[i].a,a[i].b);
83 ans[a[i].pos][0]=dep[a[i].a]+dep[a[i].b]-2*dep[c]+1;
84 ans[a[i].pos][1]=ask(begin[a[i].a])+ask(begin[a[i].b])-ask(begin[c])-ask(begin[fa[c]]);
85 }
86 rep(i,1,size) printf("%d %d\n",ans[i][0],ans[i][1]);
87 }