Pagini recente » Cod sursa (job #1099061) | Cod sursa (job #340669) | Cod sursa (job #2051542) | Cod sursa (job #3129284) | Cod sursa (job #3197120)
#include <bits/stdc++.h>
using namespace std;
vector<int>G[100001];
int k=0,n,m,E[200001],first[100001];
struct abc{
int nod; int lvl;
}rmq[20][200001];
void dfs(int nod,int level){
rmq[0][++k]={nod,level};
first[nod]=k;
for(auto x : G[nod]){
dfs(x,level+1);
rmq[0][++k]={nod,level};
}
}
ifstream fin("lca.in");
ofstream fout("lca.out");
int main(){
fin>>n>>m; for(int i=2;i<=n;i++){
int x; fin>>x;
G[x].push_back(i);
}
dfs(1,1);
for(int i=2;i<=k;i++)
E[i]=E[i/2]+1;
for(int p=1;(1<<p)<=k;p++)
for(int i=1;i<=k;i++){
rmq[p][i]=rmq[p-1][i];
int j = i + (1<<(p-1));
if(j<=k && rmq[p-1][j].lvl<rmq[p-1][i].lvl)
rmq[p][i]=rmq[p-1][j];
}
while(m--){
int x,y; fin>>x>>y;
if(first[x]>first[y])
swap(x,y);
x=first[x]; y=first[y];
int e = E[y-x+1];
int len =(1<<e);
if(rmq[e][x].lvl<rmq[e][y-len+1].lvl)
fout<<rmq[e][x].nod<<'\n';
else
fout<<rmq[e][y-len+1].nod<<'\n';
}
return 0;
}