洛谷月赛div2t3(就是那题重的)在比赛交了3发都挂了,然后比完听说atcoder有重题,重的题交完ac了。这是spj的锅还是程序错误如果程序有问题是哪里


这是代码
#include <bits/stdc++.h>
using namespace std;
int n,m,x,y,tt=0,l=-1,r=-1,maxlen,now,xx;
int a[4000010],b[4000010],c[4000010],e[2000010],f[2000010],g[2000010],h[2000010];
bool ff;
struct stc
{
int opt,x,k,ans;
}d[2000010];
bool cmp(stc a,stc b)
{
return (a.x<b.x)||(a.x==b.x)&&(a.k<b.k);
}
void dfs(int t,int fa,int len)
{
if (len>=maxlen)
{
maxlen=len;
if (now==1) l=t;
if (now==2) r=t;
}
int s=c[t];
while (s)
{
if (a[s]!=fa) dfs(a[s],t,len+1);
s=b[s];
}
}
void dfs2(int t,int fa,int len)
{
f[len]=t;
if (t==r)
{
for (int i=1;i<=len;i++) g[i]=f[i];
ff=true;
return;
}
int s=c[t];
while (s)
{
if (a[s]!=fa) dfs2(a[s],t,len+1);
s=b[s];
if (ff) return;
}
}
void dfs3(int t,int fa,int len)
{
int s=c[t];
h[len]=t;
for (int i=e[t];i<e[t+1];i++) if (d[i].k<=len)
{
d[i].ans=h[len-d[i].k];
} else
{
int tem=d[i].k-len,now=h[0];
if (f[now]+tem<=maxlen) d[i].ans=g[f[now]+tem];
if (f[now]-tem>=1) d[i].ans=g[f[now]-tem];
}
while (s)
{
if (a[s]!=fa)
if (f[a[s]]==-1) dfs3(a[s],t,len+1); else dfs3(a[s],t,0);
s=b[s];
}
}
bool cmp2(stc a,stc b)
{
return a.opt<b.opt;
}
int main()
{
scanf("%d",&n);
scanf("%d",&m);
for (int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
a[++tt]=x;b[tt]=c[y];c[y]=tt;
a[++tt]=y;b[tt]=c[x];c[x]=tt;
}
for (int i=1;i<=m;i++)
{
scanf("%d%d",&d[i].x,&d[i].k);
d[i].opt=i;d[i].ans=-1;
}
sort(d+1,d+1+m,cmp);
d[0].x=0;
for (int i=0;i<=n;i++) e[i]=-1;
for (int i=1;i<=m;i++) if (d[i-1].x!=d[i].x) e[d[i].x]=i;
e[d[m].x+1]=m+1;
for (int i=d[m].x;i>=1;i--) if (e[i]==-1) e[i]=e[i+1];
maxlen=0;
now=1;
dfs(1,0,1);
now=2;
dfs(l,0,1);
ff=false;
dfs2(l,0,1);
for (int i=1;i<=n;i++) f[i]=-1;
for (int i=1;i<=maxlen;i++) f[g[i]]=i;
dfs3(l,0,0);
sort(d+1,d+1+m,cmp2);
for (int i=1;i<=m;i++) printf("%d\n",d[i].ans);
}