Pagini recente » Cod sursa (job #81497) | Cod sursa (job #240198) | Cod sursa (job #2437840) | Cod sursa (job #1572753) | Cod sursa (job #2121856)
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("lca.in",ios::in);
ifstream buba("buba.in",ios::in);
ofstream fout("lca.out",ios::out);
int n,m,dp[20][100100],niv[100100],lg2[100100];
vector<int> V[100100];
void dfs(int nod,int nivel){
niv[nod]=nivel;
for(auto x: V[nod]) dfs(x,nivel+1);
}
int salt(int nod, int pas)
{
int bit;
while(pas!=0)
{
bit=(pas-(pas&(pas-1)));
pas=pas-bit;
nod=dp[lg2[bit]][nod];
}
return nod;
}
int main()
{
int i,j,u,v,a,b,idb,r;
fin>>n>>m;
for(i=2;i<=n;i++)
{
fin>>dp[0][i];
V[dp[0][i]].push_back(i);
}
dfs(1,1);
for(i=0;i<20;i++) lg2[1<<i]=i;
for(i=1;(1<<i)<=n;i++)
for(j=1;j<=n;j++)
dp[i][j]=dp[i-1][dp[i-1][j]];
for(i=1;i<=m;i++)
{
fin>>u>>v;
if(niv[u]>niv[v]) swap(u,v);
//acum: niv[u]<=niv[v]
v=salt(v,niv[v]-niv[u]);
//acum: niv[u]==niv[v];
idb=17;
while(idb>=0)
{
a=salt(u,(1<<idb));
b=salt(v,(1<<idb));
if(a!=b)
{
u=a;
v=b;
}
idb--;
}
if(u!=v)
r=dp[0][u];
else
r=u;
fout<<r<<"\n";
}
}