Pagini recente » Cod sursa (job #2340716) | Cod sursa (job #28059) | Cod sursa (job #1089594) | Cod sursa (job #1809773) | Cod sursa (job #2392697)
#include <bits/stdc++.h>
#define DMAX 100010
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> a[DMAX];
int euler[2*DMAX];
bool da[DMAX];
void citire();
int M[2*DMAX][30];
bool este[DMAX];
void eulere(int start);
int level[2*DMAX];
int nreuler,nrnivel;
int n,m;
int index[DMAX];
void creareRMQ();
int main()
{
citire();
return 0;
}
void citire()
{int x,y,k;
int i,j;
fin>>n>>m;
for(i=2;i<=n;i++)
{
fin>>x;
a[x].push_back(i);
}
level[0]=-1;
eulere(1);
nrnivel=nreuler;
creareRMQ();
for(i=1;i<=m;i++)
{
fin>>x>>y;
if(index[x]<index[y])
{
k=log2(index[y]-index[x]+1);
if(level[M[index[x]][k]]<=level[M[index[y]-(1<<k)+1][k]])
fout<<euler[M[index[x]][k]]<<'\n';
else
fout<<euler[M[index[y]-(1<<k)+1][k]]<<'\n';
}
else
{
k=log2(index[x]-index[y]+1);
if(level[M[index[y]][k]]<=level[M[index[x]-(1<<k)+1][k]])
fout<<euler[M[index[y]][k]]<<'\n';
else
fout<<euler[M[index[x]-(1<<k)+1][k]]<<'\n';
}
}
}
void eulere(int start)
{bool ok=0;
int i;
euler[++nreuler]=start;
da[start]=1;
level[nreuler]=level[nreuler-1]+1;
if(!este[start])
este[start]=1,index[start]=nreuler;
for(i=0;i<a[start].size();i++)
if(!da[a[start][i]])
{eulere(a[start][i]);
euler[++nreuler]=start;
level[nreuler]=level[nreuler-1]-1;
}
}
void creareRMQ()
{
int i,j;
for(i=1;i<=nrnivel;i++)
M[i][0]=i;
for(j=1;(1<<j)<=nrnivel;j++)
for(i=1;i+(1<<j)-1<=nrnivel;i++)
if(level[M[i][j-1]]<level[M[i+(1<<(j-1))][j-1]])
M[i][j]=M[i][j-1];
else
M[i][j]=M[i+(1<<(j-1))][j-1];
}