Pagini recente » Cod sursa (job #2504332) | Cod sursa (job #2607285)
#include <fstream>
#define L 17
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int N=100001;
const int M=2*N;
const int P=2000001;
int lst[N], urm[2*M], vf[2*M], nr, ti[N], to[N], t[L][N], timp;
int n, m;
void adauga(int x, int y)
{
vf[++nr]=y;
urm[nr]=lst[x];
lst[x]=nr;
}
void dfs(int x)
{
ti[x]=++timp;
for(int p=lst[x]; p!=0; p=urm[p])
{
int y=vf[p];
if(ti[y]==0)
{
dfs(y);
t[0][y]=x;
}
}
to[x]=++timp;
}
int lca(int x, int y)
{
if(ti[x]<=ti[y] and to[x]<=to[y])
return x;
int pas=L-1;
while(pas>=0)
{
int s=t[pas][x];
if(s!=0 and (ti[s]>ti[y] or to[y]>to[s]))
x=s;
pas--;
}
return t[0][x];
}
int main()
{
in>>n>>m;
for(int i=1; i<n; i++)
{
int x;
in>>x;
adauga(i+1,x);
adauga(x,i+1);
}
//t[i][j]= al 2^i-lea stramos al lui j;
for(int i=1; i<L; i++)
for(int j=1; j<=n; j++)
{
t[i][j]=t[i-1][t[i-1][j]];
}
dfs(1);
while(m)
{
m--;
int a,b;
in>>a>>b;
out<<lca(a,b)<<"\n";
}
return 0;
}