Pagini recente » Cod sursa (job #2700502) | Cod sursa (job #1354229) | Cod sursa (job #1082327) | Cod sursa (job #548117) | Cod sursa (job #2392538)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[100100];
vector <int> euler,ad;
int n,nr,m,p[100100];
void parcurgere_euler(int rad,int adancime)
{
int i;
nr++;
if(p[rad]==0)p[rad]=nr;
//cout<<rad<<'\n';
ad.push_back(adancime);
euler.push_back(rad);
for(i=0;i<v[rad].size();i++)
{
parcurgere_euler(v[rad][i],adancime+1);
// cout<<rad<<'\n';
nr++;
if(p[rad]==0)p[rad]=nr;
ad.push_back(adancime);
euler.push_back(rad);
}
}
int i,j,x,A,B,N,ad1,ad2,D[500100][22];
int main()
{
f>>n>>m;
for(i=2;i<=n;i++)
{
f>>x;
v[x].push_back(i);
}
parcurgere_euler(1,0);
// for(i=0;i<ad.size();i++)g<<ad[i]<<" ";
//g<<'\n';
//for(i=1;i<=n;i++)
// g<<p[i]<<" ";
N=euler.size();
for(i=1;i<=N;i++)
D[i][0]=euler[i-1];
for(j=1;(1<<j)<=N;j++)
{
for(i=1;i+(1<<j)-1<=N;i++)
{
// pun "-1" ca e in STL
ad1 = ad[p[D[i][j-1]]-1];
ad2 = ad[p[D[i+(1<<(j-1))][j-1]]-1];
// g<<ad1<<" "<<ad2<<'\n';
if(ad1<ad2)D[i][j]=D[i][j-1];
else D[i][j]=D[i+(1<<(j-1))][j-1];
}
}
for(i=1;i<=m;i++)
{
f>>A>>B;
A=p[A];
B=p[B];
if(A>B)swap(A,B);
x=log2(B-A+1);
ad1 = ad[p[D[A][x]]-1];
ad2 = ad[p[D[B-(1<<x)+1][x]]-1];
// g<<D[A][x]<<" ";
if(ad1<ad2)g<<D[A][x]<<'\n';
else g<<D[B-(1<<x)+1][x]<<'\n';
}
return 0;
}