Cod sursa(job #2396810)

Utilizator T_george_TGeorge Teodorescu T_george_T Data 3 aprilie 2019 20:38:27
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
#define NMAX 100005
vector <int>v[NMAX];
int rmq[20][4*NMAX],depth[3*NMAX],n,m,first[3*NMAX],last=-1,euler[3*NMAX];
void bfs(int node,int papa){
    euler[++last]=node;
    depth[node]=depth[papa]+1;
    first[node]=last;
    for(auto y:v[node]){
        if(y!=papa){
            bfs(y,node);
            euler[++last]=node;
        }
    }
}
void build_rmq(){
    int n=last;
    for(int i=0;i<=n;i++)
        rmq[0][i]=euler[i];
    for(int j=1;(1<<j)<=n;j++)
    for(int i=0;i+(1<<(j-1))-1<=n;i++){
        if(depth[rmq[j-1][i]]<depth[rmq[j-1][i+(1<<(j-1))]])
            rmq[j][i]=rmq[j-1][i];
        else
            rmq[j][i]=rmq[j-1][i+(1<<(j-1))];
    }
}
int interogare(int st,int dr){
    int i=first[st];
    int j=first[dr];
    int pow=log2(j-i+1);
    if(depth[rmq[pow][i]]<depth[rmq[pow][j-(1<<pow)+1]])
        return rmq[pow][i];
    return rmq[pow][j-(1<<pow)+1];
}
int main()
{
    in>>n>>m;
    for(int i=2;i<=n;i++){
        int papa;
        in>>papa;
        v[papa].push_back(i);
    }
    depth[0]=-1;
    bfs(1,0);
    build_rmq();
   for(int j=1;j<=m;j++){
    int st,dr;
    in>>st>>dr;
    out<<interogare(st,dr)<<'\n';
   }
    return 0;
}