只有25pts。Wa on 6-20
感觉写的没啥问题捏
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+100;
int n,m,c,p[N],w[N],rfl[N];
int anc[N][22],de[N];
int f[N][22],g[N][22],pos[N],pos1[N],Pos[N];
vector<int>E[N];
void add(int x,int y){
E[x].push_back(y);
}
struct node{int id,s;}; vector<node>qes[N];
inline void dfs1(int u,int fa){
// cout<<u<<' '<<w[u]<<endl;
if(w[u]==1) pos1[u]=u;
else pos1[u]=pos1[fa];
int P=pos[w[u]]; pos[w[u]]=u;
if(w[u]>=1) f[u][0]=pos[w[u]+1],g[u][0]=pos[w[u]-1];
de[u]=de[fa]+1,anc[u][0]=fa;
for(int i=0;i<E[u].size();i++){
int v=E[u][i];
if(v==fa) continue;
dfs1(v,u);
}
pos[w[u]]=P;
}
int LCA(int x,int y){
if(de[x]<de[y]) swap(x,y);
for(int i=20;i>=0;i--) if(de[anc[x][i]]>=de[y]) x=anc[x][i];
if(x==y) return x;
for(int i=19;i>=0;i--) if(anc[x][i]!=anc[y][i]) x=anc[x][i],y=anc[y][i];
return anc[x][0];
}
int bb[N],ans[N];
void dfs2(int u,int fa){
int BB=bb[w[u]];
bb[w[u]]=(w[u]==0?0:u);
for(int k=0;k<qes[u].size();k++){
int t=u,s=qes[u][k].s;
int lca=LCA(s,t); s=pos1[s];
int sit;
if(de[s]<de[lca]) sit=0;
else sit=1;
if(de[s]>=de[lca]) for(int i=20;i>=0;i--) if(de[f[s][i]]>=de[lca]){
// cout<<qes[u][k].id<<": "<<f[s][i]<<endl;
sit=w[f[s][i]];
break;
}
// cout<<qes[u][k].id<<':'<<sit<<' '<<s<<endl;
int l=sit+1,r=c,res=sit;
while(l<=r){
int mid=(l+r)>>1; bool flag=1;
int now=bb[mid];
if(de[now]<de[lca]){r=mid-1;continue;}
int ssit=mid;
for(int i=20;i>=0;i--){
if(de[g[now][i]]>=de[lca]){
ssit=w[g[now][i]];
break;
}
}
if(ssit>sit+1) r=mid-1;
else res=mid,l=mid+1;
}
ans[qes[u][k].id]=res;
}
for(int i=0;i<E[u].size();i++){
int v=E[u][i];
if(v==fa)continue;
dfs2(v,u);
}
bb[w[u]]=BB;
}
int main(){
// freopen("P7518_6.in","r",stdin);
// freopen("gem2.out","w",stdout);
cin>>n>>m>>c;
for(int i=1;i<=c;i++) scanf("%d",&p[i]),rfl[p[i]]=i;
for(int i=1;i<=n;i++) scanf("%d",&w[i]),w[i]=rfl[w[i]];
for(int i=1;i<n;i++){
int x,y; scanf("%d%d",&x,&y);
add(x,y),add(y,x);
}
int Q; cin>>Q;
for(int i=1;i<=Q;i++){
int s,t; scanf("%d%d",&s,&t);
qes[t].push_back((node){i,s});
}
dfs1(1,0);
for(int u=1;u<=n;u++) for(int k=1;k<=20;k++) anc[u][k]=anc[anc[u][k-1]][k-1],f[u][k]=f[f[u][k-1]][k-1],g[u][k]=g[g[u][k-1]][k-1];
dfs2(1,0);
for(int i=1;i<=Q;i++) cout<<ans[i]<<endl;
return 0;
}