rt,蒟蒻的 双log 二分+倍增,前6个AC其余全TLE。求救!
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
const int N=2e5+10,lgN=17;
int p[N],a[N],l[N];
int n,m,k,q;
vector<int> g[N];
int fa[N][lgN+1],ps[N][lgN+1],dep[N];
int xj[N][lgN+1];
int p1[N];
void dfs(int x,int fa,int dp=1){
::fa[x][0]=fa;
dep[x]=dp;
for(auto v:g[x]){
if(v!=fa)dfs(v,x,dp+1);
}
}
vector<int> poss[N];
void evaldfs(int x,int fa){
poss[a[x]].push_back(x);
ps[x][0]=poss[a[x]+1].back();
xj[x][0]=poss[a[x]-1].back();
p1[x]=poss[1].back();
for(auto v:g[x]){
if(v!=fa)evaldfs(v,x);
}
poss[a[x]].pop_back();
}
void bitwor(){
rep(i,1,lgN)rep(j,1,n)fa[j][i]=fa[fa[j][i-1]][i-1];
rep(i,0,m+2)poss[i].push_back(0);
evaldfs(1,0);
rep(i,1,lgN)rep(j,1,n)ps[j][i]=ps[ps[j][i-1]][i-1];
rep(i,1,lgN)rep(j,1,n)ps[j][i]=xj[xj[j][i-1]][i-1];
}
int lca(int u,int v){
if(u==v)return u;
if(dep[u]<dep[v])swap(u,v);
per(i,lgN,0){
if(dep[fa[u][i]]>=dep[v]){
u=fa[u][i];
}
}
if(u==v)return u;
per(i,lgN,0){
if(fa[u][i]!=fa[v][i])u=fa[u][i],v=fa[v][i];
}
return fa[u][0];
}
vector<pair<int,int>> querys[N];
vector<int> anss[N];
int climbup(int x,int y){
int fr=0;
int ans=0;
for(int i=lgN;i>=0;i--){
if(dep[ps[x][i]]>=dep[y]){
x=ps[x][i];fr=1;
ans+=(1<<i);
}
}
if(!fr)return ans;
else return ans+climbup(x,y);
}
int climbpb(int x,int y){
int fr=0;
int ans=0;
for(int i=lgN;i>=0;i--){
if(dep[xj[x][i]]>=dep[y]){
x=xj[x][i];fr=1;
ans+=(1<<i);
}
}
if(!fr)return ans;
else return ans+climbpb(x,y);
}
void avdfs(int x,int fa){
poss[a[x]].push_back(x);
for(auto [lc,w]:querys[x]){//
int l=-1,dlt=1<<lgN;
while(dlt){
if(w+l+dlt<=m){
int tar=poss[w+l+dlt].back();
if(dep[tar]<dep[lc]){
;
}else{
int zg=climbpb(tar,lc);
if(zg-l-dlt>=0){
l+=dlt;
}
}
}
dlt>>=1;
}
anss[x].push_back(w+l);
}
for(auto v:g[x]){
if(v!=fa)avdfs(v,x);
}
poss[a[x]].pop_back();
}
vector<pair<int,int>> Q;
signed main(){
cin>>n>>m>>k;
rep(i,1,k)cin>>p[i];
rep(i,1,k)l[p[i]]=i;
rep(i,1,n)cin>>a[i];
rep(i,1,n)a[i]=l[a[i]];
rep(i,1,n-1){
int u,v;cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,0);
bitwor();
int q;cin>>q;
while(q--){
int u,v;cin>>u>>v;
int lc=lca(u,v);
u=p1[u];int w;
if(dep[u]<dep[lc]){
w=0;
}
else w=climbup(u,lc)+1;
querys[v].push_back({lc,w+1});
Q.push_back({v,querys[v].size()-1});
}
avdfs(1,0);
for(auto [u,v]:Q){
cout<<anss[u][v]<<'\n';
}
}