- 大概就是dsu on tree的一种特殊情况 是on的
- 每个结点可以公用数据结构
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;
#define fi first
#define se second
#define pb push_back
#define inf 1ll<<62
#define db double
#define endl "\n"
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define de_bug(x) cerr << #x << "=" << x << endl
#define all(a) a.begin(),a.end()
#define IOS std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fer(i,a,b) for(int i=a;i<=b;i++)
#define der(i,a,b) for(int i=a;i>=b;i--)
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
const int mod = 1e9 + 7;
const int N = 1e6 + 10;
int n, m , k;
vi g[N];
int son[N];
int len[N];
int l[N],r[N];
vector<pii>q[N];
int f[N];
int ans[N];
int idx;
int s[N];
int a[N];
void dfs(int u,int fa) {
f[u]=fa;
for(auto v:g[u]) {
if(v!=fa) {
dfs(v,u);
if(!son[u]||len[son[u]]<len[v])son[u]=v;
}
}
len[u]=len[son[u]]+1;
}
void dfs2(int x) {
l[x]=++idx;
r[x]=l[x]+len[x]-1;
if(son[x])dfs2(son[x]);
for(auto v:g[x]) {
if(v!=f[x]&&v!=son[x]) {
dfs2(v);
}
}
}
void dsu(int u) {
if(son[u]) {
dsu(son[u]);
}
for(auto v:g[u]) {
if(v!=f[u]&&v!=son[u]) {
dsu(v);
for(int x=l[v],k=1; x<=r[v]; x++,++k) {
s[l[u]+k]+=s[x];
}
}
}
s[l[u]]+=a[u];
for(auto & it:q[u]) {
ans[it.fi]+=s[l[u]+it.se];
}
}
void solve() {
cin>>n;
fer(i,1,n)cin>>a[i];
fer(i,1,n-1) {
int a,b;
cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
dfs(1,0);
dfs2(1);
cin>>m;
fer(i,1,m) {
int a,b;
cin>>a>>b;
q[a].push_back({i,b});
}
dsu(1);
fer(i,1,m) {
cout<<ans[i]<<endl;
}
}
signed main() {
IOS;
int _ = 1;
while( _-- )
solve();
return 0;
}