Pagini recente » Cod sursa (job #988675) | Cod sursa (job #267812) | Cod sursa (job #11275) | Cod sursa (job #169060) | Cod sursa (job #2151548)
#include <iostream>
#include <fstream>
#define MAX 100001
using namespace std;
int n,m,a,b,st,dr,mij;
int lv[MAX],s[MAX][17];
void parcurge(int nod){
if(lv[nod])return;
parcurge(s[nod][0]); lv[nod]=lv[s[nod][0]]+1;
}
int stramos(int nod,int gr){
for(int sp=0;gr;sp++,gr/=2)if(gr%2)nod=s[nod][sp];
return nod;
}
int main()
{
ifstream f ("lca.in");
ofstream g ("lca.out");
f>>n>>m; for(int i=2;i<=n;i++)f>>s[i][0];
for(int i=1;i<=16;i++)for(int j=1;j<=n;j++)s[j][i]=s[s[j][i-1]][i-1];
lv[1]=1; for(int i=1;i<=n;i++)parcurge(i);
for(int i=1;i<=m;i++){
f>>a>>b;
if(lv[a]>lv[b])a=stramos(a,lv[a]-lv[b]);
else b=stramos(b,lv[b]-lv[a]);
st=0,dr=lv[a]-1;
while(st<dr){
mij=(st+dr)/2;
if(stramos(a,mij)==stramos(b,mij))dr=mij;
else st=mij+1;
}
g<<stramos(a,st)<<'\n';
}
f.close();
g.close();
return 0;
}