#include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std; const int N=8e4+5; vector<int>G[N]; int f[N][32],d[N],w[N],n,q; bool cmp(int a,int b) { return a>b; } void dfs(int u,int fa,int dep) { d[u]=dep; f[u][0]=fa; int len=G[u].size(); for(int i=0;i<len;i++) { if(G[u][i]==fa)continue; dfs(G[u][i],u,dep+1); } } void bz() { for(int j=1;j<=30;j++) for(int i=1;i<=n;i++) f[i][j]=f[f[i][j-1]][j-1]; } int query(int u,int v) { if(d[u]<d[v])swap(u,v); int dc=d[u]-d[v]; for(int i=0;i<30;i++) if(dc&(1<<i)) u=f[u][i]; if(u==v)return u; for(int i=30;i>=0;i--) if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i]; return f[u][0]; } int main() { scanf("%d%d",&n,&q); for(int i=1;i<=n;i++) scanf("%d",&w[i]); for(int i=0;i<n-1;i++) { int u,v; scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } dfs(1,0,0); bz(); for(int i=0;i<q;i++) { int k,a,b; scanf("%d%d%d",&k,&a,&b); if(k==0)w[a]=b; else { int lca=query(a,b); vector<int>rout; while(a!=lca) { rout.push_back(w[a]); a=f[a][0]; } while(b!=lca) { rout.push_back(w[b]); b=f[b][0]; } rout.push_back(w[lca]); if(rout.size()<k) { puts("invalid request!"); continue; } sort(rout.begin(),rout.end(),cmp); printf("%d\n",rout.at(k-1)); } } return 0; }
原文:http://www.cnblogs.com/homura/p/5719734.html