#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10, maxn = 1e9 + 7;
int in[N], out[N], rk[N], fa[N][21], tot;
int root[N], ls[N << 5], rs[N << 5], sum[N << 5], num;
int val[N], n, m;
vector<int> g[N];
void update(int &rt, int pre, int l, int r, int x, int v){
rt = ++num, ls[rt] = ls[pre], rs[rt] = rs[pre], sum[rt] = sum[pre] + v;
if (l == r) return;
int mid = l + r >> 1;
if (x <= mid) update(ls[rt], ls[pre], l, mid, x, v);
else update(rs[rt], rs[pre], mid + 1, r, x, v);
}
int query(int rt1, int rt2, int l, int r, int L, int R){
if (l >= L && r <= R) return sum[rt2] - sum[rt1];
int ans = 0, mid = l + r >> 1;
if (L <= mid) ans += query(ls[rt1], ls[rt2], l, mid, L, R);
if (R > mid) ans += query(rs[rt1], rs[rt2], mid + 1, r, L, R);
return ans;
}
void dfs(int rt, int f){
fa[rt][0] = f, in[rt] = ++tot, rk[tot] = rt;
for (int i = 1; i <= 20; i++) fa[rt][i] = fa[fa[rt][i - 1]][i - 1];
for(auto to : g[rt]){
if(to == f) continue;
dfs(to, rt);
}
out[rt] = tot;
}
int get(int rt, int maxn){
for (int i = 20; i >= 0; i--)
if (fa[rt][i] && val[fa[rt][i]] <= maxn) rt = fa[rt][i];
return rt;
}
inline void solve(){
cin >> n;
for(int i = 1, u, v; i < n; i++){
cin >> u >> v;
g[u].push_back(v), g[v].push_back(u);
}
for(int i = 1; i <= n; i++) cin >> val[i];
dfs(1, 0);
for(int i = 1; i <= n; i++)
update(root[i], root[i - 1], 1, maxn, val[rk[i]], 1);
cin >> m;
for(int i = 1, x, L, R; i <= m; i++){
cin >> x >> L >> R;
if(val[x] >= L && val[x] <= R){
int qx = get(x, R);
cout << query(root[in[qx] - 1], root[out[qx]], 1, maxn, L, R) << endl;
}
else cout << 0 << endl;
}
}
signed main(){
freopen("stdin.in", "r", stdin);
freopen("stdout.out", "w", stdout);
ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
solve();
return 0;
}