我觉得复杂度没问题,但是只能拿五十分,有没有好心人帮忙卡一下
#include<bits/stdc++.h>
#define bug cout<<"I AK IOI"<<endl;
#define gc getchar
#define in inline
using namespace std;
const int N=2e6+1;
inline void print(int x) {if (x < 0) putchar('-'), x = -x; if(x > 9) print(x / 10); putchar(x % 10 + '0');}
inline int read(){int res = 0, f = 0; char ch = gc();for(; !isdigit(ch); ch = gc()) f |= (ch == '-'); for(;isdigit(ch);ch=gc()) res = (res << 1) + (res << 3) + (ch ^ '0');return f ? -res :res;}
struct node{
int to,nxt;
}e[N*2];int cnt,head[N];
in void add(int x,int y)
{
e[++cnt].nxt=head[x];e[cnt].to=y;head[x]=cnt;
e[++cnt].nxt=head[y];e[cnt].to=x;head[y]=cnt;
}
int er[]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912};
int n,q,lg[N],fa[3][N][21];
int rot1,rot2,Max=-1;
int dep[N][3];
in void dfs(int x,int faa,int bj)
{
dep[x][bj]=dep[faa][bj]+1;
for(int i=head[x];i;i=e[i].nxt)
{
int nxt=e[i].to;
if(faa==nxt) continue ;
dfs(nxt,x,bj);
}
if(dep[x][bj]>Max){
Max=dep[x][bj];
if(bj==1) rot1=x;
else rot2=x;
}
}
in void DFS(int x,int faa,int bj)
{
dep[x][bj]=dep[faa][bj]+1;
fa[bj][x][0]=faa;
for(int i=1;i<=lg[dep[x][bj]];i++) fa[bj][x][i]=fa[bj][fa[bj][x][i-1]][i-1];
for(int i=head[x];i;i=e[i].nxt)
{
int nxt=e[i].to;
if(faa==nxt) continue ;
DFS(nxt,x,bj);
}
}
int cx(int a,int k,int bj)
{
for(int i=lg[dep[a][bj]];i>=0;i--)
{
if(k<er[i]) continue ;
k-=er[i];
a=fa[bj][a][i];
}
return a;
}
signed main(){
cin>>n>>q;
for(register int i = 1; i <= n; ++i) lg[i] = lg[i-1] + (1 << lg[i-1] == i);
for(register int a,b,i=1;i<n;i++)
{
a=read(),b=read();
add(a,b);
}
dfs(1,0,1);Max=-1;dfs(rot1,0,2);
DFS(rot1,0,1);DFS(rot2,0,2);
// cout<<fa[2][2][0]<<endl<<endl;
// return 0;
for(register int a,k,i=1;i<=q;i++)
{
a=read(),k=read();
if(dep[a][1]<=k && dep[a][2]<=k) cout<<-1<<endl;
else{
if(dep[a][1]>k){
print(cx(a,k,1)),cout<<endl;
continue ;
}
print(cx(a,k,2)),cout<<endl;
}
}
}