代码是这样
#include<bits/stdc++.h>
using namespace std;
#define N 1000005
struct node{
int next,to;
}edge[N*2];
int head[N],cnt=0;
void addedge(int u,int v){
edge[++cnt].next=head[u];
head[u]=cnt;
edge[cnt].to=v;
}
int dep[N];
int f[N][50];
void dfs(int u,int fa){
dep[u]=dep[fa]+1;
f[u][0]=fa;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==fa)continue;
dfs(v,u);
}
}
inline int read(){
int a=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
a=a*10+c-'0';
c=getchar();
}
return a*f;
}
int n,q;
int du[N];
int lca(int u,int v){
if(dep[u]<=dep[v])swap(u,v);
for(int i=20;i>=0;i--)
if(dep[f[u][i]]>=dep[v])
u=f[u][i];
if(u==v)
return u;
for(int i=20;i>=0;i--)
if(f[u][i]!=f[v][i])
u=f[u][i],v=f[v][i];
return f[u][0];
}
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
n=read();
for(int i=1;i<n;i++){
int u=read(),v=read();
addedge(u,v),addedge(v,u);
}
dfs(1,0);
for(int j=1;j<=20;j++){
for(int i=1;i<=n;i++)
f[i][j]=f[f[i][j-1]][j-1];
}
q=read();
// printf("%d\n",lca(3,5));
while(q--){
int l=read(),r=read(),k=read();
int ans=0;
for(int i=l;i<=r-k+1;i++){
int q=i;
for(int j=i+1;j<=i+k-1;j++)
q=lca(q,j);
ans=max(ans,dep[q]);
}
printf("%d\n",ans);
}
return 0;
}
球球了