1 #include <cstdio>
2 #include <iostream>
3 #include <cmath>
4 #define N 50010
5 using namespace std;
6 int n,m,o,a[N],tree[N*3],f[N][20],dep[N];
7 int LCA(int x,int y)
8 {
9 if (!x&&!y) return 0; if (!x||!y) return x+y;
10 if (dep[x]<dep[y]) swap(x,y);
11 if (dep[x]!=dep[y]) for (int i=log(n)/log(2);i>=0;i--) if (dep[f[x][i]]>=dep[y]) x=f[x][i];
12 if (x==y) return x;
13 for (int i=log(n)/log(2);i>=0;i--) if (f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
14 return f[x][0];
15 }
16 int getlca(int d,int l,int r,int k)
17 {
18 if (l==r) return tree[d];
19 int mid=l+r>>1;
20 if (k<=mid) return LCA(tree[d],getlca(d*2,l,mid,k)); else return LCA(tree[d],getlca(d*2+1,mid+1,r,k));
21 }
22 void change(int d,int l,int r,int L,int R,int k)
23 {
24 if (l==L&&r==R) { tree[d]=LCA(tree[d],k); return; }
25 int mid=l+r>>1;
26 if (R<=mid) change(d*2,l,mid,L,R,k); else if (L>mid) change(d*2+1,mid+1,r,L,R,k); else change(d*2,l,mid,L,mid,k),change(d*2+1,mid+1,r,mid+1,R,k);
27 }
28 int main()
29 {
30 scanf("%d",&n),dep[1]=1;
31 for (int i=1;i<=n;i++) scanf("%d",&a[i]);
32 for (int i=1,l,r;i<=n;i++)
33 {
34 scanf("%d%d",&l,&r),o=1;
35 if (i>1)
36 {
37 int lca=getlca(1,1,n,a[i]);
38 if (lca)
39 {
40 f[i][0]=lca,dep[i]=dep[lca]+1;
41 for (int j=1;j<=log(n)/log(2);j++) f[i][j]=f[f[i][j-1]][j-1];
42 }
43 else dep[i]=-1,o=0;
44 }
45 if (o) change(1,1,n,l,r,i);
46 printf("%d\n",dep[i]);
47 }
48 }