Cod sursa(job #2395901)

Utilizator T_george_TGeorge Teodorescu T_george_T Data 2 aprilie 2019 23:16:57
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
#define NMAX 100030
vector <int>v[NMAX];
int rmq[NMAX][20],n,a[NMAX],m,depth[NMAX],last,first[NMAX];

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;
}