#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define pii pair<int,int>
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define pb push_back
#define eb emplace_back
#define rep(x,y,z) for (int x=y;x<z;x++)
int par(int x, vector<int> &dsu){
if (dsu[x]<0) return x;
return par(dsu[x],dsu);
}
signed main(){
cin.tie(nullptr)->ios::sync_with_stdio(0);
//input
int n,m,q;
cin>>n>>m>>q;
vector<vector<int>> G(n);
rep(i,1,n){
int u,v;
cin>>u>>v;
u--; v--;
G[u].pb(v);
G[v].pb(u);
}
vector<int> dd(n), ff(n), lf(n), st(n);
vector<int> ord(n);
int tim=0;
function<void(int,int)> dfs=[&](int u, int f){
ord[tim]=u;
st[u]=tim++;
ff[u]=f;
int p=lf[ff[u]], q=lf[p];
if (u!=f&&dd[q]-dd[p]==dd[p]-dd[ff[u]]) lf[u]=q;
else lf[u]=ff[u];
for (int v:G[u]){
if (v==f) continue;
dd[v]=dd[u]+1;
dfs(v,u);
}
};
dfs(0,0);
function<int(int,int)> cal=[&](int u, int v){
if (dd[u]<dd[v]) swap(u,v);
int cu=u, cv=v;
while (dd[u]>dd[v]){
if (dd[lf[u]]>=dd[v]) u=lf[u];
else u=ff[u];
}
while (u!=v){
if (lf[u]!=lf[v]) u=lf[u],v=lf[v];
else u=ff[u],v=ff[v];
}
// cout<<cu+1<<' '<<cv+1<<" lca: "<<u+1<<' '<<dd[cu]+dd[cv]-dd[u]*2+1<<'\n';
return dd[cu]+dd[cv]-dd[u]*2+1;
};
vector<int> A(m);
vector<int> cop(n,0);
rep(i,0,m) cin>>A[i], A[i]--, cop[A[i]]++;
rep(i,0,n){
if (cop[i]==0){
A.pb(i); m++;
cop[i]++;
}
}
// cout<<m<<'\n';
// rep(i,0,m) cout<<A[i]<<' ';
// cout<<'\n';
//precompute lca, dfs order
//build dsu
int sz=n;
vector<int> ll(n);
vector<int> rr(n);
vector<int> wl(n), wr(n), hl(n), hr(n);
//rem function
#define vit vector<int>::iterator
stack<pair<vit,int>> row;
function<void(int,bool)> rem=[&](int x, bool o){
// cout<<x+1<<' '<<sz<<" -> ";
x=st[x];
int lp=hl[par((x+n-1)%n,ll)];
int rp=hr[par((x+1)%n,rr)];
if (lp==-1){
lp=par(n-1,ll);
}
if (rp==n){
rp=par(0,rr);
}
// cout<<"*"<<ord[x]+1<<' '<<ord[lp]+1<<' '<<ord[rp]+1<<'\n';
// cout<<cal(ord[x],ord[lp])<<' '<<cal(ord[x],ord[rp])<<' '<<cal(ord[lp],ord[rp])<<'\n';
sz-=(cal(ord[x],ord[lp])+cal(ord[x],ord[rp])-cal(ord[lp],ord[rp]))/2;
if (x+1==n){
if (o) row.push({hr.begin()+par(x,rr),hr[par(x,rr)]});
hr[par(x,rr)]=n;
}else{
int pa=par(x,rr);
int pb=par(x+1,rr);
if (pa!=pb){
if (wr[pa]<wr[pb]) swap(pa,pb);
if (o) row.push({hr.begin()+pa,hr[pa]});
hr[pa]=max(hr[pa],hr[pb]);
if (o) row.push({wr.begin()+pa,wr[pa]});
wr[pa]+=wr[pb];
if (o) row.push({rr.begin()+pb,rr[pb]});
rr[pb]=pa;
}
}
if (x==0){
if (o) row.push({hl.begin()+par(x,ll),hl[par(x,ll)]});
hl[par(x,ll)]=-1;
}else{
int pa=par(x,ll);
int pb=par(x-1,ll);
if (pa!=pb){
if (wl[pa]<wl[pb]) swap(pa,pb);
if (o) row.push({hl.begin()+pa,hl[pa]});
hl[pa]=min(hl[pa],hl[pb]);
if (o) row.push({wl.begin()+pa,wl[pa]});
wl[pa]+=wl[pb];
if (o) row.push({ll.begin()+pb,ll[pb]});
ll[pb]=pa;
}
}
// cout<<sz<<'\n';
};
//input qry, process
int bz=300;
int bn=(m+bz-1)/bz;
struct Q { int l; int r; int id; };
auto com=[](Q a, Q b){
return a.r>b.r;
};
vector<vector<Q>> qry(bn);
rep(i,0,q){
int l,r;
cin>>l>>r;
l--; r--;
qry[l/bz].pb({l,r,i});
}
rep(i,0,bn){
sort(all(qry[i]),com);
}
//sqrt decom
vector<int> ans(q);
rep(i,0,bn){
fill(all(ll),-1);
fill(all(rr),-1);
fill(all(wl),1);
fill(all(wr),1);
iota(all(hl),0);
iota(all(hr),0);
sz=n;
vector<int> fre(cop);
int ql=0, qr=m-1;
while (ql<i*bz){
fre[A[ql]]--;
if (fre[A[ql]]==0) rem(A[ql],0);
ql++;
// cout<<ql<<' '<<qr<<' '<<sz<<'\n';
}
for (auto [l,r,id]:qry[i]){
// cout<<ql<<' '<<qr<<" -> ";
while (qr>r){
fre[A[qr]]--;
if (fre[A[qr]]==0) rem(A[qr],0);
qr--;
// cout<<ql<<' '<<qr<<' '<<sz<<'\n';
}
int oz=sz;
while (ql<l){
fre[A[ql]]--;
if (fre[A[ql]]==0) rem(A[ql],1);
ql++;
// cout<<ql<<' '<<qr<<' '<<sz<<'\n';
}
ans[id]=sz;
sz=oz;
// cout<<ql<<' '<<qr<<'\n';
while (!row.empty()){
auto [it,v]=row.top();
row.pop();
*it=v;
}
while (ql>i*bz){
ql--;
fre[A[ql]]++;
}
// cout<<ql<<' '<<qr<<' '<<sz<<'\n';
}
}
//output
rep(i,0,q){
cout<<ans[i]<<'\n';
}
return 0;
}