Pagini recente » Cod sursa (job #22750) | Cod sursa (job #1212789) | Cod sursa (job #79607) | Cod sursa (job #2284917) | Cod sursa (job #2153511)
#include <iostream>
#include <fstream>
#include <vector>
#define MAX 100001
using namespace std;
int n,m,p,a,b,st,dr,mij,nvmax;
int lv[MAX],s[MAX][17];
vector<int> nd[MAX];
void parcurge(int nod,int niv){
lv[nod]=niv;nvmax=max(nvmax,niv);
for(auto i:nd[nod])parcurge(i,niv+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],nd[s[i][0]].push_back(i);
parcurge(1,1);
for(int i=1;(1<<i)<=nvmax;i++)for(int j=1;j<=n;j++)s[j][i]=s[s[j][i-1]][i-1];
for(int i=1;i<=m;i++){
f>>a>>b;
st=0,dr=lv[a]-1;
while(st<dr){
mij=(st+dr)/2;
if(stramos(a,mij)==stramos(b,mij+lv[b]-lv[a]))dr=mij;
else st=mij+1;
}
g<<stramos(a,st)<<'\n';
}
f.close();
g.close();
return 0;
}