Pagini recente » Cod sursa (job #2080557) | Cod sursa (job #2465716) | Cod sursa (job #1488953) | Cod sursa (job #2235592) | Cod sursa (job #2975825)
#include <bits/stdc++.h>
using namespace std;
#define cin fin
#define cout fout
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<vector<int>> ad,rmq;
const int nmx = 1e5 + 1;
const int lvlmx = 24;
int in[nmx],h[nmx];
int t;
void dfs(int k,int hg){
h[k] = hg;
rmq[0].push_back(k);
in[k] = rmq[0].size()-1;
for(int to : ad[k]){
dfs(to,hg+1);
rmq[0].push_back(k);
}
}
int main(){
int n,m;
cin >> n >> m;
t = 0;
ad = vector<vector<int>>(n+1);
rmq = vector<vector<int>>(lvlmx);
for(int i=2;i<=n;i++){
int x;
cin >> x;
ad[x].push_back(i);
}
dfs(1,0);
int sz = rmq[0].size();
for(int k=1;(1<<k)<sz;k++){
for(int i=0;i<sz-(1<<k)+1;i++){
if(h[rmq[k-1][i]] < h[rmq[k-1][i+(1<<k-1)]])
rmq[k].push_back(rmq[k-1][i]);
else
rmq[k].push_back(rmq[k-1][i+(1<<k-1)]);
}
}
while(m--){
int u,v;
cin >> u >> v;
int k = 0;
int i = in[u], j = in[v];
if(i>j)
swap(i,j);
int len = j-i+1;
while((1<<k+1)<len)
k++;
if(h[rmq[k][i]] < h[rmq[k][j-(1<<k)+1]])
cout << rmq[k][i] << "\n";
else
cout << rmq[k][j-(1<<k)+1] << "\n";
}
}