Pagini recente » Cod sursa (job #1121276) | Cod sursa (job #2033394) | Cod sursa (job #775648) | Cod sursa (job #2332337) | Cod sursa (job #3306489)
#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_map>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m, i, a, b, cnt;
int lin[200005][2], r[18][200005][2], E[200005];
vector<int> ad[100000];
pair<int, int> um[100005];
void dfs(int nod, int niv){
cnt++;
lin[cnt][0]=nod, lin[cnt][1]=niv;
um[nod].first=um[nod].second=cnt;
for(int j=0;j<ad[nod].size();j++){
dfs(ad[nod][j], niv+1);
cnt++;
lin[cnt][0]=nod, lin[cnt][1]=niv;
um[nod].second=cnt;
}
}
int main()
{
fin>>n>>m;
for(i=2;i<=n;i++){
fin>>a;
ad[a].push_back(i);
}
cnt=0;
dfs(1, 0);
E[1]=0;
for(i=2;i<=cnt;i++){
E[i]=E[i-1];
if((i&(i-1))==0){
E[i]++;
}
}
for(i=1;i<=cnt;i++){
r[0][i][0]=lin[i][1];
r[0][i][1]=i;
}
for(int p=1;(1<<p)<=cnt;p++){
for(i=1;i<=cnt;i++){
if(i+(1<<(p-1))<=cnt){
if(r[p-1][i][0]<=r[p-1][i+(1<<(p-1))][0]){
r[p][i][0]=r[p-1][i][0];
r[p][i][1]=r[p-1][i][1];
}else{
r[p][i][0]=r[p-1][i+(1<<(p-1))][0];
r[p][i][1]=r[p-1][i+(1<<(p-1))][1];
}
}else{
r[p][i][0]=r[p-1][i][0];
r[p][i][1]=r[p-1][i][1];
}
}
}
for(i=1;i<=m;i++){
fin>>a>>b;
a=um[a].first;
b=um[b].first;
if(b<a)
swap(a, b);
//cout<<a<<" "<<b<<'\n';
int e=E[b-a+1];
int ans;
if(r[e][a][0]<=r[e][b-(1<<e)+1][0]){
//cout<<r[e][a][0]<<'\n';
ans=r[e][a][1];
}else{
//cout<<r[e][b-(1<<e)+1][0]<<'\n';
ans=r[e][b-(1<<e)+1][1];
}
fout<<lin[ans][0]<<'\n';
}
return 0;
}