Pagini recente » Cod sursa (job #699720) | Cod sursa (job #684622) | Cod sursa (job #533304) | Cod sursa (job #588986) | Cod sursa (job #2603542)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> ADJ[100005];
int N,M,P;
int AD[100055];
int PAP[100005];
int Euler[100055];
int table[25][100055],Arr[100055];
void df (int nod,int ad)
{
++P;
Euler[P]=nod;
AD[P]=ad;
PAP[nod]=P;
vector<int> :: iterator it;
for (it=ADJ[nod].begin();it!=ADJ[nod].end();++it)
{
int val=(*it);
df(val,ad+1);
++P;
Euler[P]=nod;
AD[P]=ad;
}
}
int main()
{
fin >> N >> M;
int i,j;
for (i=2;i<=N;++i)
{
int x;
fin >> x;
ADJ[x].push_back(i);
}
df(1,0);
table[0][1]=1;
for (i=2;i<=P;++i)
{
Arr[i]=Arr[i>>1]+1;
table[0][i]=i;
}
for (i=1;(1<<i)<P;++i)
{
int L=1<<(i-1);
for (j=1;j<=P-(1<<i)+1;++j)
{
if(AD[table[i-1][j]]<AD[table[i-1][j+L]])
{
table[i][j]=table[i-1][j];
}
else
{
table[i][j]=table[i-1][j+L];
}
}
}
for (i=1;i<=M;++i)
{
int st,dr;
fin >> st >> dr;
int a=PAP[st],b=PAP[dr];
if (a>b)
{
int aux=a;
a=b;
b=aux;
}
int L=Arr[b-a+1];
int rez=table[L][a];
int LL=b-a+1-(1<<L);
if (AD[rez]>AD[table[L][a+LL]])
{
rez=table[L][a+LL];
}
fout << Euler[rez] << '\n';
}
fin.close();
fout.close();
return 0;
}