Pagini recente » Cod sursa (job #367650) | Cod sursa (job #744934) | Cod sursa (job #369218) | Cod sursa (job #1215637) | Cod sursa (job #2571484)
#include <iostream>
#include <fstream>
#include <stdlib.h>
#define N 100005
#define L 20
using namespace std;
ifstream x("lca.in");
ofstream y("lca.out");
int k,n,m,*v[N],val;
int rmq[L][N << 2];
int x1,y1;
int l[N << 1],h[N << 1],lg[N << 1],first[N];
void citire()
{
x>>n>>m;
for(int i=1;i<=n;i++)
{
v[i]=(int *) realloc(v[i],sizeof(int));
v[i][0]=0;
}
for(int i=2;i<=n;i++)
{
x>>val;
v[val][0]++;
v[val]=(int *) realloc(v[val],(v[val][0]+1)*sizeof(int));
v[val][v[val][0]]=i;
}
}
void dfs(int nod, int levi)
{
h[++k]=nod;
l[k]=levi;
first[nod]=k;
for(int i=1;i<=v[nod][0];i++)
{
dfs(v[nod][i],levi+1);
h[++k]=nod;
l[k]=levi;
}
}
void Rmq()
{
for(int i=2;i<=k;i++)
lg[i]=lg[i >> 1]+1;
for(int i=1;i<=k;i++)
rmq[0][i]=i;
for(int i=1;(1 << i)<k ;i++)
for(int j=1;j<=k-(1 << i);j++)
{
int lng= 1 << (i-1);
rmq[i][j]=rmq[i-1][j];
if(l[rmq[i-1][j+lng]]<l[rmq[i][j]])
rmq[i][j]=rmq[i-1][j+lng];
}
}
int lca(int a, int b)
{
int dif,lng,sol,sh;
int st=first[a];
int dr=first[b];
if(st>dr)
swap(st,dr);
dif=dr-st+1;
lng=lg[dif];
sol=rmq[lng][st];
sh=dif-(1 << lng);
if(l[sol]>l[rmq[lng][st+sh]])
sol=rmq[lng][st+sh];
return h[sol];
}
int main()
{
citire();
dfs(1,0);
Rmq();
while(m--)
{
x>>x1>>y1;
y<<lca(x1,y1)<<'\n';
}
x.close();
y.close();
return 0;
}