WA
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
struct a1{
int nex,to;
}x[N];int head[N],p;
void add(int a,int b){
x[++p].nex=head[a];
x[p].to=b;
head[a]=p;
}
int dfn[N],id[N],tot,dis[N],siz[N];
void dfs(int a,int fa){
dfn[a]=++tot;id[tot]=a;siz[a]=1;
for(int q=head[a];q;q=x[q].nex){
int o=x[q].to;
if(o!=fa)dfs(o,a),siz[a]+=siz[o];
}
}
struct a2{
int l,r,k,id;
}a[N];
int len,cnt;
bool a22(a2 a,a2 b){
if(a.l/len==b.l/len)return a.r/len<b.r/len;
return a.l/len<b.l/len;
}
long long ans[N],anss,h[N],v[N],belong[N],L[N],R[N];
void work(){
int n=2e5;
len=sqrt(n);cnt=n/len;
if(n%len!=0)cnt++;
for(int q=1;q<=cnt;q++)L[q]=(q-1)*len+1,R[q]=len*q;R[cnt]=n;
for(int q=1;q<=n;q++)belong[q]=(q-1)/len+1;
}
void J(int a){
a=dis[a];
h[belong[a]]++;
v[a]++;
}
void S(int a){
a=dis[a];
h[belong[a]]--;
v[a]--;
}
int G(int k){
int i,p=0;
for(int q=1;q<=cnt;q++){
if(p+h[q]<k)p+=h[q];
else{i=q;break;}
}
for(int q=L[i];q<=R[i];q++){
if(p+v[q]<k)p+=v[q];
else return q;
}
}
int _a[N],V[N];
int main(){
int n,m;cin>>n;
work();
for(int q=1;q<=n;q++)cin>>dis[q],_a[q]=dis[q];
sort(_a+1,_a+1+n);
for(int q=1;q<=n;q++)dis[q]=lower_bound(_a+1,_a+1+n,dis[q])-_a,V[dis[q]]=q;
for(int q=1;q<n;q++){
int a,b;cin>>a>>b;
add(a,b);add(b,a);
}
dfs(1,1);
cin>>m;
for(int q=1;q<=m;q++){
int i,k;cin>>i>>k;
a[q].l=dfn[i];a[q].r=dfn[i]+siz[i]-1;
a[q].k=k;a[q].id=q;
}
sort(a+1,a+1+n,a22);
int l=1,r=0;
for(int q=1;q<=m;q++){
while(l>a[q].l)l--,J(l);
while(l<a[q].l)S(l),l++;
while(r<a[q].r)r++,J(r);
while(r>a[q].r)S(r),r--;
ans[a[q].id]=V[G(a[q].k)];
}
for(int q=1;q<=m;q++)cout<<ans[q]<<"\n";
return 0;
}