Pagini recente » Cod sursa (job #2590334) | Cod sursa (job #977181) | Cod sursa (job #1033274) | Cod sursa (job #186950) | Cod sursa (job #611193)
Cod sursa(job #611193)
#include<cstdio>
#include<vector>
#define N 150010
#define M 250010
using namespace std;
vector<int> S[N],ST;
int n,q,m,i,j,k,u,v,x,y,z,T[N],P[N],L[N],LA,LN,X[M],Q[17][M];
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&q);
for(i=2;i<=n;i++){scanf("%d",&j);S[j].push_back(i);T[i]=j;}
ST.push_back(1);
for(;ST.size();)
{
i=ST.back();Q[0][++m]=i;
if(!P[i]){P[i]=m;L[i]=L[T[i]]+1;}
if(!S[i].size()){ST.pop_back();continue;}
j=S[i].back();ST.push_back(j);S[i].pop_back();
}
for(i=2;i<=m;i<<=1)X[i]=1;
for(i=1;i<=m;i++)X[i]+=X[i-1];
for(i=0,j=1;;i++,j++)
{
LA=1<<i;LN=1<<j;
if(LN>m)break;
for(k=1;k+LA<=m;k++)
{
u=Q[i][k];v=Q[i][k+LA];
Q[j][k]=L[u]<L[v]?u:v;
}
}
for(;q;q--)
{
scanf("%d%d",&u,&v);
u=P[u];v=P[v];x=min(u,v);y=u+v-x;
k=X[y-x+1];j=1<<k;
u=Q[k][x];v=Q[k][y-j+1];
printf("%d\n",L[u]<L[v]?u:v);
}
return 0;
}