Pagini recente » Cod sursa (job #328097) | Cod sursa (job #2401732) | Cod sursa (job #1558741) | Cod sursa (job #722458) | Cod sursa (job #2445278)
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#define maxl int(log2(400000))+2
using namespace std;
int n, m, i, j, rmq[maxl][400004], level[100001], head[100001], v, first[100001];
vector<int> graph[100001];
void dfs(int node);
int mn(int node1, int node2);
int main()
{
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%d%d", &n, &m);
for(i=2; i<=n; ++i) {
int h;
scanf("%d", &h);
graph[h].push_back(i); head[i]=h;
}
level[0]=-1;
dfs(1);
for(j=1; (1<<j)<=v; ++j){
for(i=1; i<=v; ++i){
int next=i+(1<<(j-1));
rmq[j][i]=rmq[j-1][i];
if(next<=v) rmq[j][i]=mn(rmq[j][i], rmq[j-1][next]);
}
}
for(i=1; i<=m; ++i){
int x, y;
scanf("%d%d", &x, &y);
x=first[x]; y=first[y];
j=log2(y-x+1);
printf("%d\n", mn(rmq[j][x], rmq[j][y-(1<<j)+1]));
}
return 0;
}
void dfs(int node){
level[node]=level[head[node]]+1;
for(auto i:graph[node]){
rmq[0][++v]=node;
if(!first[node]) first[node]=v;
dfs(i);
}
rmq[0][++v]=node;
if(!first[node]) first[node]=v;
return;
}
int mn(int node1, int node2){
if(level[node1]<=level[node2]) return node1;
else return node2;
}