Pagini recente » Cod sursa (job #380266) | Cod sursa (job #216533) | Cod sursa (job #114642) | Cod sursa (job #1212479) | Cod sursa (job #2720710)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[100100], euler, adancime;
int indice,poz[100100],h[100100];
void parcurgere_euler(int nod, int adancime_nod)
{
int i;
indice++;
if(poz[nod]==0)poz[nod]=indice;
h[nod]=adancime_nod;
euler.push_back(nod);
adancime.push_back(adancime_nod);
for(i=0;i<v[nod].size();i++)
{
int vecin=v[nod][i];
parcurgere_euler(vecin,adancime_nod+1);
indice++;
euler.push_back(nod);
adancime.push_back(adancime_nod);
}
}
int n,m,i,N,x,y,p1,p2,k,K,a,dindice[500100][20];
int main()
{
f>>n>>m;
for(i=2;i<=n;i++)
{
f>>x;
v[x].push_back(i);
}
parcurgere_euler(1,0);
N=euler.size();
for(i=1;i<=N;i++)dindice[i][0]=euler[i-1];
for(k=1;(1<<k)<=N;k++)
{
for(i=1;i+(1<<k)-1<=N;i++)
{
if(h[dindice[i][k-1]]<h[dindice[i+(1<<(k-1))][k-1]])dindice[i][k]=dindice[i][k-1];
else dindice[i][k]=dindice[i+(1<<(k-1))][k-1];
}
}
for(i=1;i<=m;i++)
{
f>>x>>y;
p1=poz[x];
p2=poz[y];
if(p1>p2)swap(p1,p2);
K=log2(p2-p1+1);
if(h[dindice[p1][K]] < h[dindice[p2-(1<<K)+1][K]])g<<dindice[p1][K]<<'\n';
else g<<dindice[p2-(1<<K)+1][K]<<'\n';
}
return 0;
}