#include <iostream>
#include <vector>
#define ai_jiang signed main()
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define drep(a,b,c) for(int a=b;a>=c;a--)
#define all(a) a.begin(),a.end()
#define ll long long
#define id(x) ((lower_bound(all(a),x)-a.begin())+1)
using namespace std;
using poly=vector<ll>;
namespace ai {
constexpr int N = 1e5+5;
int n,root,m,l,r,lans,dtot,mxdep,rt[N],a[N],dfn[N],dep[N],siz[N],tot;
vector<int> e[N];
vector<int> depp[N];
struct node { int l,r,s[2],mn=2e9; } tr[N*(__lg(N)+2)];
#define lc(x) tr[x].s[0]
#define rc(x) tr[x].s[1]
void dfs(int u,int f) {
dfn[u]=++dtot;
dep[u]=dep[f]+1;
siz[u]=1;
mxdep=max(mxdep,dep[u]);
depp[dep[u]].push_back(u);
for(auto v:e[u]) {
if(v==f) continue;
dfs(v,u);
siz[u]+=siz[v];
}
}
void pushup(int x) { tr[x].mn=min(tr[lc(x)].mn,tr[rc(x)].mn); }
void modify(int x,int &y,int l,int r,int df,int v) {
y=++tot; tr[y]=tr[x];
if(l==r) { tr[y].mn=v; return; }
int mid=l+r>>1;
if(df<=mid) modify(lc(x),lc(y),l,mid,df,v);
else modify(rc(x),rc(y),mid+1,r,df,v);
pushup(y);
}
void mf2(int x,int l,int r,int df,int v) {
if(l==r) { tr[x].mn=v; return; }
int mid=l+r>>1;
if(df<=mid) mf2(lc(x),l,mid,df,v);
else mf2(rc(x),mid+1,r,df,v);
pushup(x);
}
int query(int x,int l,int r,int L,int R) {
if(L<=l&&r<=R) return tr[x].mn;
int mid=l+r>>1,ans=2e9;
if(L<=mid) ans=min(ans,query(lc(x),l,mid,L,R));
if(R>mid) ans=min(ans,query(rc(x),mid+1,r,L,R));
return ans;
}
}
using namespace ai;
ai_jiang {
cin.tie(0); cout.tie(0);
cin>>n>>root;
rep(i,1,n) cin>>a[i];
rep(i,1,n-1) {
int aa,bb; cin>>aa>>bb;
e[aa].push_back(bb);
e[bb].push_back(aa);
} dfs(root,0);
rep(i,1,n) {
if(!depp[i].size()) break;
modify(rt[i-1],rt[i],1,n,dfn[depp[i][0]],a[depp[i][0]]);
for(int j=1;j<depp[i].size();j++)
mf2(rt[i],1,n,dfn[depp[i][j]],a[depp[i][j]]);
}
cin>>m;
rep(i,1,m) {
cin>>l>>r; l=(l+lans)%n+1; r=(r+lans)%n;
cout<<(lans=query(rt[min(mxdep,dep[l]+r)],1,n,dfn[l],dfn[l]+siz[l]-1))<<'\n';
}
return 0;
}