对于这道题,我写了如下代码,本地运行没问题,洛谷上不开 O2 可以正常运行,开了 O2 就 RE 了。
交到了 AtCoder 上全 RE 了,请问这是什么 UB?
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,q,st,ed,dis[N],depst[N],deped[N],fst[N][20],fed[N][20];
vector<int>g[N];
inline int fw(int u,int fa)
{
for(int i=0;i<g[u].size();++i)
{
int v=g[u][i];if(v==fa)continue;
dis[v]=dis[u]+1;fw(v,u);
}
}
inline void dfs(int u,int fa,int type)
{
if(type==1)
{
fst[u][0]=fa;
for(int i=1;i<=18;++i)
fst[u][i]=fst[fst[u][i-1]][i-1];
}
else
{
fed[u][0]=fa;
for(int i=1;i<=18;++i)
fed[u][i]=fed[fed[u][i-1]][i-1];
}
for(int i=0;i<g[u].size();++i)
{
int v=g[u][i];if(v==fa)continue;
if(type==1)depst[v]=depst[u]+1;
else deped[v]=deped[u]+1;
dfs(v,u,type);
}
}
signed main()
{
cin>>n;
for(int i=1;i<n;++i)
{
int u,v;cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
fw(1,1);
int dmax;
for(int i=1;i<=n;++i)
if(dis[i]>dmax)dmax=dis[i],st=i;
memset(dis,0,sizeof(dis));fw(st,st);
dmax=0;
for(int i=1;i<=n;++i)
if(dis[i]>dmax)dmax=dis[i],ed=i;
dfs(st,st,1);dfs(ed,ed,2);
cin>>q;
while(q--)
{
int u,k;cin>>u>>k;
if(depst[u]<k&&deped[u]<k)cout<<-1<<endl;
else if(depst[u]>=k)
{
for(int i=18;i>=0;--i)
if(k>=(1<<i))k-=(1<<i),u=fst[u][i];
cout<<u<<endl;
}
else
{
for(int i=18;i>=0;--i)
if(k>=(i<<i))k-=(1<<i),u=fed[u][i];
cout<<u<<endl;
}
}
return 0;
}