#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define endl "\n"
#define int long long
const int N = 1e5 + 5;
const int LG = log2(N) + 1;
int n, q, ct = 0, num = 1e5;
int a[N], root[N], level[N];
int st[21*N], st2[21*N], lc[21*N], rc[21*N];
int tim=0;
int parent[LG][N];
vector<int> g[N];
void dfs0(int k, int par, int lvl)
{
parent[0][k] = par;
level[k] = lvl;
for(auto it:g[k])
{
if(it==par)
continue;
dfs0(it, k, lvl+1);
}
}
void precompute()
{
for(int i=1;i<LG;i++)
for(int j=1;j<=n;j++)
if(parent[i-1][j])
parent[i][j]=parent[i-1][parent[i-1][j]];
}
int LCA(int u, int v)
{
if(level[u]<level[v])
swap(u,v);
int diff=level[u]-level[v];
for(int i=LG-1;i>=0;i--)
{
if((1<<i) & diff)
{
u=parent[i][u];
}
}
if(u==v)
return u;
for(int i=LG-1;i>=0;i--)
{
if(parent[i][u] && parent[i][u]!=parent[i][v])
{
u=parent[i][u];
v=parent[i][v];
}
}
return parent[0][u];
}
int build(int L, int R)
{
int node = ++ct;
if(L==R)
return node;
int M = (L+R)/2;
lc[node] = build(L, M);
rc[node] = build(M+1, R);
return node;
}
int update(int onode, int L, int R, int pos)
{
int node = ++ct;
if(L==R)
{
st[node] = st[onode] + 1;
st2[node] = st2[onode] + L;
return node;
}
int M = (L+R)/2;
lc[node] = lc[onode];
rc[node] = rc[onode];
if(pos <= M)
lc[node] = update(lc[onode], L, M, pos);
else
rc[node] = update(rc[onode], M+1, R, pos);
st[node] = st[lc[node]] + st[rc[node]];
st2[node] = st2[lc[node]] + st2[rc[node]];
return node;
}
int query(int nodeu, int nodev, int nodelca, int nodelcapar, int L, int R, int pos)
{
if(L==R)
{
int have = st[nodeu] + st[nodev] - st[nodelca] - st[nodelcapar];
int canDefeat = pos/L;
return min(have, canDefeat);
}
int M = (L+R)/2;
int leftval = st2[lc[nodeu]] + st2[lc[nodev]] - st2[lc[nodelca]] - st2[lc[nodelcapar]];
int rightval = st2[rc[nodeu]] + st2[rc[nodev]] - st2[rc[nodelca]] - st2[rc[nodelcapar]];
int defeated = st[lc[nodeu]] + st[lc[nodev]] - st[lc[nodelca]] - st[lc[nodelcapar]];
if(leftval > pos)
return query(lc[nodeu], lc[nodev], lc[nodelca], lc[nodelcapar], L, M, pos);
else
return defeated + query(rc[nodeu], rc[nodev], rc[nodelca], rc[nodelcapar], M+1, R, pos - leftval);
}
void dfs(int u, int par)
{
int onode = root[par];
root[u] = update(onode, 1, num, a[u]);
for(auto &it:g[u])
{
if(it==par)
continue;
dfs(it, u);
}
}
int32_t main()
{
IOS;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n-1;i++)
{
int u, v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
cin>>q;
root[0] = build(1, num);
dfs0(1, 0, 1);
precompute();
dfs(1, 0);
while(q--)
{
int u, v, k;
cin>>u>>v>>k;
int lca = LCA(u, v);
int parlca = parent[0][lca];
int ans = query(root[u], root[v], root[lca], root[parlca], 1, num, k);
cout<<ans<<endl;
}
return 0;
}