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
| #include<bits/stdc++.h> #define REG register #define MAXN 100005 #define FORE(i,now) for(REG int i=head[now];i;i=ed[i].nxt) using namespace std; inline int read(){ REG int x(0); REG char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) x=(x*10)+(c^48),c=getchar(); return x; } inline int Min(int a,int b){return a<b?a:b;}
int n,q,a[MAXN],dep[MAXN];
struct Edge{ int v,nxt; }ed[MAXN<<1]; int head[MAXN],cnt; inline void adde(int u,int v){ed[++cnt]=(Edge){v,head[u]},head[u]=cnt;} inline void add(int u,int v){adde(u,v),adde(v,u);}
int rt[MAXN],tot; #define Ls(now) (t[now].ls) #define Rs(now) (t[now].rs) #define mid ((l+r)>>1) struct Tree{ int val,ls,rs; }t[MAXN<<8]; inline void Push_up(int now){t[now].val=Min(t[Ls(now)].val,t[Rs(now)].val);} void Update(int& now,int l,int r,int pos,int status){ if(!now) t[now=++tot].val=1e9+7; t[now].val=Min(t[now].val,status); if(l==r) return; if(mid>=pos) Update(Ls(now),l,mid,pos,status); else Update(Rs(now),mid+1,r,pos,status); Push_up(now); } int Askmin(int now,int l,int r,int x,int y){ if(!now) return 1e9+7; if(l>=x&&r<=y) return t[now].val; int res=1e9+7; if(mid>=x) res=Min(res,Askmin(Ls(now),l,mid,x,y)); if(mid<y) res=Min(res,Askmin(Rs(now),mid+1,r,x,y)); return res; } int Merge(int a,int b){ if(!a||!b) return a|b; int now=++tot; t[now].val=Min(t[a].val,t[b].val); Ls(now)=Merge(Ls(a),Ls(b)); Rs(now)=Merge(Rs(a),Rs(b)); return now; }
void dfs(int now,int fa){ dep[now]=dep[fa]+1; Update(rt[now],1,n,dep[now],a[now]); FORE(i,now){ int v=ed[i].v; if(v==fa) continue; dfs(v,now); rt[now]=Merge(rt[now],rt[v]); } }
void Work(){ n=read(),rt[0]=read(); for(REG int i=1;i<=n;++i) a[i]=read(); for(REG int i=1;i<n;++i) add(read(),read()); t[0].val=1e9+7; dfs(rt[0],0); int lastans=0; q=read(); while(q--){ int x=read(),k=read(); x=(x+lastans)%n+1; k=(k+lastans)%n; printf("%d\n",lastans=Askmin(rt[x],1,n,dep[x],Min(dep[x]+k,n))); } }
int main(){ Work(); }
|