代码如下,卡不过去
#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int in()
{
int f=1,s=0;
char c=getchar();
while(c>'9'||c<'0')
{
if(c=='-')
{
f=-1;
}
c=getchar();
}
while(c<='9'&&c>='0')
{
s=s*10+c-'0';
c=getchar();
}
return s*f;
}
inline void out(int x)
{
char ch[11];
int t=0;
while(x)
{
ch[++t]=x%10+'0';
x/=10;
}
for(int i=t;i>=1;i--)putchar(ch[i]);
}
const int N=1000620;
const int M=2000620;
int n,m,k,now,cnt,u,v;
int e,head[N],nxt[M],to[M];
int deep[N],fath[N][21];
inline void add(int x,int y)
{
e++;
to[e]=y;
nxt[e]=head[x];
head[x]=e;
}
void dfs(int now,int fa)
{
deep[now]=deep[fa]+1;
fath[now][0]=fa;
for(int k=1;(1<<k)<=deep[now];k++)
{
fath[now][k]=fath[fath[now][k-1]][k-1];
}
for(int i=head[now];i;i=nxt[i])
{
v=to[i];
if(v==fa)continue;
dfs(v,now);
}
}
int lca(int x,int y)
{
if(deep[x]>deep[y])
{
swap(x,y);
}
for(int k=20;k>=0;k--)
{
if(deep[x]<=deep[fath[y][k]])
{
y=fath[y][k];
}
}
if(x==y)
{
return x;
}
for(int k=20;k>=0;k--)
{
if(fath[x][k]!=fath[y][k])
{
x=fath[x][k];
y=fath[y][k];
}
}
return fath[x][0];
}
int find(int now,int sum)
{
int s=0;
for(int k=20;k>=0;k--)
{
if(s+deep[now]-deep[fath[now][k]]<=sum)
{
s+=deep[now]-deep[fath[now][k]];
now=fath[now][k];
}
}
return now;
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<n;i++)
{
u=in();v=in();
add(u,v);
add(v,u);
}
dfs(m,0);
now=m;
while(k--)
{
u=in();
v=in();
cnt=lca(u,now);
if((deep[now]-deep[cnt])+(deep[u]-deep[cnt])<=v)
{
out(u);
putchar(' ');
now=u;
}
else
{
if(deep[now]-deep[cnt]>v)
{
now=find(now,v);
out(now);
putchar(' ');
}
else
{
v=(deep[now]-deep[cnt])+(deep[u]-deep[cnt])-v;
now=find(u,v);
out(now);
putchar(' ');
}
}
}
return 0;
}