1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| int n,q,t,a[N],b[N],mod,c[N<<2]; struct Node{ int siz,val,ls,rs; inline Node(){} inline Node(int siz,int val) : siz(siz),val(val) {} }p[N*40]; int rt[N],fa[N<<2][21],dep[N<<2],ans; vi e[N<<2]; #define ls(k) p[k].ls #define rs(k) p[k].rs struct SegmentTree{ int tot; inline SegmentTree(){tot=0;} inline void PushUp(int k){p[k].siz=p[ls(k)].siz+p[rs(k)].siz;} inline void Change(int &k,int last,int l,int r,int w,int x1,int x2){ k=++tot;p[k]=p[last];int mid=(l+r)>>1; if(l==r){p[k].siz=x1;p[k].val=x2;return;} if(w<=mid) Change(ls(k),ls(last),l,mid,w,x1,x2); else Change(rs(k),rs(last),mid+1,r,w,x1,x2);PushUp(k); } inline P Ask(int k,int l,int r,int siz){ if(l==r) return mp(l,p[k].val);int mid=(l+r)>>1; if(siz<=p[ls(k)].siz) return Ask(ls(k),l,mid,siz); else return Ask(rs(k),mid+1,r,siz-p[ls(k)].siz); } inline void Build(int &k,int l,int r){ k=++tot;int mid=(l+r)>>1;if(l==r){p[k].siz=1;p[k].val=l;return;} Build(ls(k),l,mid);Build(rs(k),mid+1,r);PushUp(k); } }st;
inline void dfs(int k,int fat){ fa[k][0]=fat;rep(i,1,20) fa[k][i]=fa[fa[k][i-1]][i-1];dep[k]=dep[fat]+1; for(int to:e[k]) if(to!=fat) dfs(to,k); } inline int Lca(int a,int b){ if(dep[a]<dep[b]) swap(a,b); dec(i,0,20) if(dep[fa[a][i]]>=dep[b]) a=fa[a][i];if(a==b) return a; dec(i,0,20) if(fa[a][i]!=fa[b][i]) a=fa[a][i],b=fa[b][i];return fa[a][0]; } inline int getid(int x){ return lower_bound(b+1,b+n+2,x)-b; } inline int ID(int x){ int id=lower_bound(b+1,b+n+2,x)-b-1; return x-(1+id)*id/2; }
signed main(){ read(n);read(q);read(t);mod=(n+1)*(n+2)/2; rep(i,1,n) read(a[i]);int tot=n+1;st.Build(rt[n+1],1,n+1); rep(i,1,n+1) b[i]=(1+i)*i/2; dec(i,1,n){ P now=st.Ask(rt[i+1],1,n+1,ID(a[i])); P now2=st.Ask(rt[i+1],1,n+1,ID(a[i])+1); st.Change(rt[i],rt[i+1],1,n+1,now2.fi,0,-1); ++tot;st.Change(rt[i],rt[i],1,n+1,now.fi,1,tot); e[tot].pb(now.se);e[tot].pb(now2.se); } dfs(tot,0); rep(i,1,n) c[st.Ask(rt[getid(a[i])],1,n+1,ID(a[i])).se]=a[i]; rep(i,1,q){ int x,y;read(x);read(y); x=(x-1+t*ans)%mod+1;y=(y-1+t*ans)%mod+1; P now=st.Ask(rt[getid(x)],1,n+1,ID(x)); P now2=st.Ask(rt[getid(y)],1,n+1,ID(y)); int l=Lca(now.se,now2.se); if(now.se==now2.se){ if(x<y) swap(x,y);printf("%lld\n",(ans=y)); } else if(l==now.se||l==now2.se){ if(l==now.se) printf("%lld\n",(ans=x)); else printf("%lld\n",(ans=y)); } else{ printf("%lld\n",(ans=c[l])); } } return 0; }
|