1 #include<cstdio>
2 #include<iostream>
3 #include<cmath>
4 #include<cstring>
5 #include<algorithm>
6 using namespace std;
7 typedef long long int64;
8 char ch;
9 bool ok;
10 void read(int &x){
11 ok=0;
12 for (ch=getchar();!isdigit(ch);ch=getchar()) if (ch==‘-‘) ok=1;
13 for (x=0;isdigit(ch);x=x*10+ch-‘0‘,ch=getchar());
14 if (ok) x=-x;
15 }
16 void read(int64 &x){
17 ok=0;
18 for (ch=getchar();!isdigit(ch);ch=getchar()) if (ch==‘-‘) ok=1;
19 for (x=0;isdigit(ch);x=x*10+ch-‘0‘,ch=getchar());
20 if (ok) x=-x;
21 }
22 const int maxn=100000+5;
23 const int maxm=maxn*2;
24 int n,m,q,idx;
25 int64 N,a,b,list[maxn];
26 int root[maxn],from[maxn];
27 struct Seg{
28 int tot,siz[maxn*18],son[maxn*18][2],root[maxn];
29 void insert(int &k,int p,int l,int r,int v){
30 k=++tot,siz[k]=siz[p]+1;
31 if (l==r) return;
32 int m=(l+r)>>1;
33 if (v<=m) son[k][1]=son[p][1],insert(son[k][0],son[p][0],l,m,v);
34 else son[k][0]=son[p][0],insert(son[k][1],son[p][1],m+1,r,v);
35 }
36 void insert(int idx,int v){insert(root[idx],root[idx-1],1,n,v);}
37 int calc(int x,int y,int k){
38 x=root[x-1],y=root[y];
39 int l=1,r=n,m;
40 while (l<r){
41 m=(l+r)>>1;
42 if (siz[son[y][0]]-siz[son[x][0]]>=k) r=m,y=son[y][0],x=son[x][0];
43 else l=m+1,k-=siz[son[y][0]]-siz[son[x][0]],y=son[y][1],x=son[x][1];
44 }
45 return l;
46 }
47 }T;
48 int dfn[maxn],last[maxn],siz[maxn];
49 struct Graph2{
50 int tot,now[maxn],son[maxm],pre[maxm],fa[maxn][18],dep[maxn];
51 int64 val[maxm],dis[maxn];
52 void put(int a,int b,int64 c){pre[++tot]=now[a],now[a]=tot,son[tot]=b,val[tot]=c;}
53 void add(int a,int b,int64 c){put(a,b,c),put(b,a,c);}
54 void dfs(int u){
55 for (int i=0;fa[u][i];i++) fa[u][i+1]=fa[fa[u][i]][i];
56 for (int p=now[u],v=son[p];p;p=pre[p],v=son[p]) if (v!=fa[u][0])
57 fa[v][0]=u,dep[v]=dep[u]+1,dis[v]=dis[u]+val[p],dfs(v);
58 }
59 void dfs2(int u){
60 siz[u]=1,dfn[u]=++idx,T.insert(idx,u);
61 for (int p=now[u],v=son[p];p;p=pre[p],v=son[p]) if (v!=fa[u][0]) dfs2(v),siz[u]+=siz[v];
62 last[u]=idx;
63 }
64 void prepare(){dfs(1),dfs2(1);}
65 void swim(int &u,int h){for (int i=17;h;i--) if (h>=(1<<i)) h-=(1<<i),u=fa[u][i];}
66 int get_lca(int u,int v){
67 if (dep[u]<dep[v]) swap(u,v);
68 swim(u,dep[u]-dep[v]);
69 if (u==v) return u;
70 for (int i=17;i>=0;i--) if (fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
71 return fa[u][0];
72 }
73 int64 get_dist(int u,int v){return dis[u]+dis[v]-2*dis[get_lca(u,v)];}
74 int find(int u,int v){
75 swim(u,dep[u]-dep[v]-1);
76 return u;
77 }
78 }G[2];
79 int calc(int64 x){return lower_bound(list+1,list+idx+1,x)-list;}
80 int main(){
81 read(n),read(m),read(q);
82 for (int i=1;i<n;i++) read(a),read(b),G[0].add(a,b,1);
83 G[0].prepare(),N=n,idx=1,root[1]=1,list[1]=N;
84 for (int i=1;i<=m;i++){
85 read(a),read(b);
86 int t=calc(b),r=root[t],bb=T.calc(dfn[r],last[r],b-list[t-1]);
87 G[1].add(idx+1,t,G[0].dis[bb]-G[0].dis[r]+1);
88 N+=siz[a],list[++idx]=N,root[idx]=a,from[idx]=bb;
89 }
90 G[1].dfs(1);
91 for (int i=1;i<=q;i++){
92 read(a),read(b);
93 int ta=calc(a),ra=root[ta],aa=T.calc(dfn[ra],last[ra],a-list[ta-1]);
94 int tb=calc(b),rb=root[tb],bb=T.calc(dfn[rb],last[rb],b-list[tb-1]);
95 int lca=G[1].get_lca(ta,tb);
96 int64 res=G[0].dis[aa]-G[0].dis[ra]+G[0].dis[bb]-G[0].dis[rb]+G[1].get_dist(ta,tb);
97 if (ta==tb) printf("%lld\n",G[0].get_dist(aa,bb));
98 else if (ta==lca){
99 int frb=from[G[1].find(tb,lca)];
100 printf("%lld\n",res-(G[0].dis[aa]+G[0].dis[frb]-G[0].get_dist(aa,frb)-2*G[0].dis[ra]));
101 }
102 else if (tb==lca){
103 int fra=from[G[1].find(ta,lca)];
104 printf("%lld\n",res-(G[0].dis[bb]+G[0].dis[fra]-G[0].get_dist(bb,fra)-2*G[0].dis[rb]));
105 }
106 else{
107 int fra=from[G[1].find(ta,lca)];
108 int frb=from[G[1].find(tb,lca)];
109 printf("%lld\n",res-(G[0].dis[fra]+G[0].dis[frb]-G[0].get_dist(fra,frb)-2*G[0].dis[root[lca]]));
110 }
111 }
112 return 0;
113 }