#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define ld long double
#define pb push_back
#define all(v) begin(v), end(v)
#define pll pair<ll, ll>
#define fi first
#define se second
#define vll vector<ll>
#define mll map<ll, ll>
mt19937_64 rng(chrono::high_resolution_clock().now().time_since_epoch().count());
const ll N = 1e5 + 6, inf = 1e18 + 7, mod = 1e9 + 7, B = 310;
ll n, m, k, q, ans[N], mp[N], c[N], res = 0;
vll adj[N];
vector<pll> v[N];
ll sz[N], dep[N], par[N], hvy[N], timer = 0, tin[N], tout[N], tour[N], head[N];
void dfs(ll p, ll u) {
sz[u] = 1;
for (ll v : adj[u]) {
if (v == p) continue;
par[v] = u;
dep[v] = dep[u] + 1;
dfs(u, v);
sz[u] += sz[v];
if (sz[v] > sz[hvy[u]]) hvy[u] = v;
}
}
void hld(ll p, ll u, ll hd) {
head[u] = hd;
tin[u] = ++timer;
tour[timer] = u;
if (hvy[u]) hld(u, hvy[u], hd);
for (ll v : adj[u]) {
if (v != p && v != hvy[u]) hld(u, v, v);
}
tout[u] = timer;
}
ll st[N*4];
void update(ll id, ll l, ll r, ll x, ll val) {
if (l > x || r < x) return;
if (l == r) {
st[id] += val;
return;
}
ll mid = (l+r) / 2;
update(id*2, l, mid, x, val);
update(id*2+1, mid+1, r, x, val);
st[id] = st[id*2] + st[id*2+1];
}
ll get(ll id, ll l, ll r, ll u, ll v) {
if (l > v || r < u) return 0;
if (u <= l && r <= v) return st[id];
ll mid = (l+r) / 2;
return get(id*2, l, mid, u, v) + get(id*2+1, mid+1, r, u, v);
}
ll lca(ll u, ll v) {
while (head[u] != head[v]) {
if (dep[head[u]] > dep[head[v]]) u = par[head[u]];
else v = par[head[v]];
}
return (dep[u] < dep[v] ? u : v);
}
ll sp[N][21], lg[N];
void build() {
for (int i = 1; i <= m; ++i) {
sp[i][0] = c[i];
lg[i] = __lg(i);
}
for (int j = 1; (1 << j) <= m; ++j) {
for (int i = 1; i + (1 << (j-1)) <= m; ++i) {
sp[i][j] = lca(sp[i][j-1], sp[i + (1 << (j-1))][j-1]);
}
}
}
ll lca_range(ll l, ll r) {
ll t = lg[r-l+1];
//cout << "l r t " << l << " " << r << " " << t << endl;
return lca(sp[l][t], sp[r - (1 << t) + 1][t]);
}
vector<pll> stk[N];
void add(ll i) {
ll u = c[i];
while (true) {
ll temp1 = dep[u] - dep[head[u]] + 1, temp2 = 0;
auto &st = stk[head[u]];
while (!st.empty()) {
auto [y, cy] = st.back();
temp2 += cy;
if (temp2 <= temp1) {
update(1, 1, m, y, -cy);
st.pop_back();
}
else {
update(1, 1, m, y, -cy);
update(1, 1, m, y, temp2-temp1);
st.back().se = temp2-temp1;
break;
}
}
st.pb({i, temp1});
update(1, 1, m, i, temp1);
if (head[u] == 1) break;
u = par[head[u]];
}
}
void solve() {
cin >> n >> m >> q;
for (int i = 1; i < n; ++i) {
ll x, y;
cin >> x >> y;
adj[x].pb(y);
adj[y].pb(x);
}
dep[1] = 1;
dfs(-1, 1);
hld(-1, 1, 1);
for (int i = 1; i <= m; ++i) cin >> c[i];
build();
for (int i = 1; i <= q; ++i) {
ll l, r;
cin >> l >> r;
v[r].pb({l, i});
}
for (int r = 1; r <= m; ++r) {
add(r);
for (auto [l, idx] : v[r]) {
ll p = lca_range(l, r);
ans[idx] = get(1, 1, m, l, r) - dep[p] + 1;
}
// for (int i = 1; i <= r; ++i) cout << get(1, 1, m, i, i) << " ";
// cout << endl;
}
for (int i = 1; i <= q; ++i) cout << ans[i] << endl;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
if (fopen(".INP", "r")) {
freopen(".INP", "r", stdin);
freopen(".OUT", "w", stdout);
}
ll tc = 1;
// cin >> tc;
while (tc--) {
solve();
}
return 0;
}