Pagini recente » Cod sursa (job #83298) | Cod sursa (job #575675) | Cod sursa (job #1438363) | Cod sursa (job #563015) | Cod sursa (job #2354004)
#include <bits/stdc++.h>
using namespace std;
#define N 500010
int n,m,a,poz[N],l,k,pozy,pozx,lg[N],rmq[21][N],level[N];
bool viz[N];
vector<int>v[N],eu;
void euler(int x, int lev)
{
if(!viz[x])
{
viz[x] = 1;
poz[x] = eu.size()+1;
}
level[x] = lev;
eu.push_back(x);
for(int i=0;i<v[x].size();i++)
{
euler(v[x][i], lev+1);
eu.push_back(x);
}
}
int meen(int x,int y)
{
if(level[x]<level[y]) return x;
return y;
}
int main()
{
ifstream cin("lca.in");
ofstream cout("lca.out");
cin>>n>>m;
lg[1] = 0;
for(int i=2;i<=n;i++)
{
cin>>a;
v[a].push_back(i);
}
euler(1, 0);
int eus = eu.size();
for(int i=0;i<eus;i++)
{
rmq[0][i] = eu[i];
if(i>=2) lg[i] = lg[i/2]+1;
}
for(k=1;(1<<k)<=eus;k++)
for(int j = 0;j + (1<<k)-1<eus;j++)
rmq[k][j] = meen(rmq[k-1][j], rmq[k-1][j+(1<<(k-1))]);
int x,y;
while(m--)
{
cin>>x>>y;
pozx = min(poz[x],poz[y]);
pozy = max(poz[y],poz[x]);
pozx--; pozy--;
k = lg[pozy-pozx+1];
cout<<meen(rmq[k][pozx], rmq[k][pozy - (1<<(k))+1])<<'\n';
}
return 0;
}