Pagini recente » Cod sursa (job #2396815) | Cod sursa (job #2396785) | Cod sursa (job #2395906)
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
#define MAX_N 100005
#define MAX_L 20
vector <int>v[MAX_N << 1];
int rmq[MAX_N << 1][MAX_L],n,a[MAX_N << 1],m,depth[MAX_N << 1],last,first[MAX_N << 1];
void build_rmq(){
for(int i=0;i<=2*n-1;i++)
rmq[i][0]=a[i];
for(int j=1;(1<<j)<=2*n-1;j++)
for(int i=0;(i+(1<<j)-1)<=2*n-1;i++)
rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
}
int interogare(int i,int j){
int pow=(int)log2(j-i+1);
return min(rmq[i][pow],rmq[j-(1<<pow)+1][pow]);
}
void dfs(int node,int papa){
depth[node]=depth[papa]+1;
a[++last]=node;
first[node]=last;
for(auto y:v[node]){
if(y!=papa){
dfs(y,node);
a[++last]=node;
}
}
}
int main()
{
in>>n>>m;
for(int i=2;i<=n;i++){
int papa;
in>>papa;
v[papa].push_back(i);
}
dfs(1,0);
build_rmq();
for(int j=1;j<=m;j++){
int st,dr;
in>>st>>dr;
out<<interogare(first[st],first[dr])<<endl;
}
return 0;
}