Pagini recente » Cod sursa (job #1240942) | Cod sursa (job #2327235)
#include <bits/stdc++.h>
#define DM 100001
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,q,aux;
int E[2*DM+5];
int L[2*DM+5];
int lg[DM+1];
int nr;
int F[DM];
int rmq[DM][19];
vector <int> v[DM];
void a(int b[])
{
for(int i=1;i<=nr;i++)
cout<<b[i]<<' ';
cout<<endl;
}
void dfs(int nod,int level)
{
E[++nr]=nod;
L[nod]=level;
if(!F[nod])
F[nod]=nr;
for(auto it:v[nod])
{
dfs(it,level+1);
E[++nr]=nod;
}
}
void g()
{
for(int i=1;i<=nr;i++)
rmq[i][0]=E[i];
for(int j=1;(1<<j)<=nr;j++)
for(int i=1;i+(1<<j)<=nr;i++)
{
rmq[i][j]=rmq[i][j-1];
if(L[rmq[i+(1<<(j-1))][j-1]] < L[rmq[i][j-1]])
rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
}
for(int i=2;i<=DM;i++)
lg[i]=lg[i/2]+1;
}
int query(int a,int b)
{
if(L[a]>L[b])
swap(a,b);
int l=F[b]-F[a]+1;
l=lg[l];
a=F[a];
b=F[b];
///query de la F[a] la F[b] in L
return min(rmq[a][l],rmq[b-(1<<l)+1][l]);
}
int n1,n2;
int main()
{
fin>>n>>q;
for(int i=2;i<=n;i++)
{ fin>>aux;
v[aux].push_back(i);
}
dfs(1,0);
g();
for(int i=1;i<=q;i++)
{
fin>>n1>>n2;
fout<<query(n1,n2)<<endl;
}
for(int i=1;i<=nr;i++)
{
for(int j=0;(1<<j)<=nr;j++)
{
cout<<rmq[i][j]<<' ';
}
cout<<endl;
}
return 0;
}