现在已经回会两个最低档部分分了
但是不会和起来写,下面代码并没有25pts还是10pts
#include<bits/stdc++.h>
#define MAXN 2000002
using namespace std;
const int INF=0x7fffffff;
namespace FastIO
{
char buf[1<<23],*p1,*p2;
#ifdef ONLINE_JUDGE
inline char gc(){return (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<22,stdin),p1==p2))?EOF:*p1++;}
#else
inline char gc(){return getchar();}
#endif
inline int read()
{
int f=1,w=0;char ch=gc();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=gc();}
while(isdigit(ch))w=w*10+ch-'0',ch=gc();
return f*w;
}
}
using FastIO::read;
using FastIO::gc;
int n,q,ans;
vector <int> g[MAXN];
vector <int> v[MAXN];
long long Size[MAXN],deg[MAXN],answer[MAXN];
inline void addedge(int u,int v)
{
g[u].push_back(v);
}
inline void dfs(int u,int fa,int deep,int max_deep)//第一档暴力分
{
if(deep==max_deep)
{
ans=max(ans,u);
return;
}
for(int v:g[u])
if(v!=fa)
dfs(v,u,deep+1,max_deep);
}
inline void solve_chains()//链的情况
{
int root;
for (int i = 1; i <= n; i++)
if (!deg[i])
root = i;
Size[root]=1;answer[1]=root;
int now=root;
while (v[now].size())
{
int son=v[now][0];
Size[son]=Size[now]+1;
answer[Size[son]]=son;
now=son;
}
while(q--)
{
int x=read(),k=read();
if (Size[x]-k <= 0 && Size[x]+k>n)
printf("-1\n");
else
printf("%lld\n", Size[x] - k > 0 ? answer[Size[x] - k] : answer[Size[x] + k]);
}
}
int main()
{
n=read(),q=read();
bool flag=true;
for(int i=1;i<n;i++)//输入并判断是不是链
{
int u=read(),v=read();
addedge(u,v);addedge(v,u);
if(u!=v+1 || v!=u+1)
flag=true;
}
if(flag==true)//第一档部分分
for(int i=1;i<=q;i++)
{
int x=read(),k=read();
ans=-1;
dfs(x,0,0,k);
printf("%d\n",ans);
}
else if(flag==false)//链
solve_chains();
return 0;
}