Pagini recente » Cod sursa (job #2117226) | Cod sursa (job #1917936) | Cod sursa (job #976047) | Cod sursa (job #51599) | Cod sursa (job #2616060)
#include <bits/stdc++.h>
using namespace std;
vector <int> v[100100];
vector <int> euler,adancime;
int indice,poz[100100];
void parcurgere_euler(int nod,int adancime_nod)
{
int i;
indice++;
if(poz[nod]==0)poz[nod]=indice;
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,k,K,x,y,p1,p2,nod_minim,lungime_interval,adancime_minima,dmin[500100][20],dindice[500100][20];
int main()
{
ifstream fin("lca.in");
ofstream fout("lca.out");
fin>>n>>m;
for(i=1;i<=n-1;i++)
{
fin>>x;
v[x].push_back(i+1);
}
parcurgere_euler(1,0);
N=euler.size();
for(i=1;i<=N;i++)dmin[i][0]=adancime[i-1],dindice[i][0]=euler[i-1];
for(k=1;(1<<k)<=N;k++)
{
for(i=1;i+(1<<k)-1<=N;i++)
{
dmin[i][k]=min(dmin[i][k-1],dmin[i+(1<<(k-1))][k-1]);
if(dmin[i][k-1] < dmin[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++)
{
fin>>x>>y;
p1=poz[x];
p2=poz[y];
if(p1>p2)swap(p1,p2);
lungime_interval=p2-p1+1;
K=log2(lungime_interval);
adancime_minima=min(dmin[p1][K],dmin[p2-(1<<K)+1][K]);
if(dmin[p1][K] < dmin[p2-(1<<K)+1][K])nod_minim=dindice[p1][K];
else nod_minim=dindice[p2-(1<<K)+1][K];
fout<<nod_minim<<'\n';
}
return 0;
}