Cod sursa(job #2571190)

Utilizator T_george_TGeorge Teodorescu T_george_T Data 4 martie 2020 21:33:41
Problema Lowest Common Ancestor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int NMAX=100005;
int n,m,rmq[20][NMAX],depth[NMAX],euler[NMAX<<1],cnt,first[NMAX],lg[NMAX<<1];
bool seen[NMAX];
vector<int>g[NMAX];
int dfs(int node,int l){
    depth[node]=l;
    first[node]=++cnt;
    euler[cnt]=node;
    for(auto y:g[node]){
        dfs(y,l+1);
        euler[++cnt]=node;
    }
}
void build_rmq(){
    for(int i=2;i<=cnt;i++)
        lg[i]=lg[i>>1]+1;
    for(int i=0;i<=cnt;i++)
      rmq[0][i]=euler[i];
    for(int i=1;i<=19;i++)
    for(int j=1;j+(1<<(i-1))-1<=cnt;j++)
     if(depth[rmq[i-1][j]]<depth[rmq[i-1][j+(1<<(i-1))]])
         rmq[i][j]=rmq[i-1][j];
       else
         rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
}
int ans(int a,int b){
     int x=first[a],y=first[b];
     if(x>y)
        swap(x,y);
     int l=lg[y-x+1],rasp=rmq[l][x];
     if(depth[rmq[l][x]]>depth[rmq[l][y-(1<<l)+1]])
      rasp=rmq[l][y-(1<<l)+1];
      return rasp;
}
int main()
{
    in>>n>>m;
    for(int i=2,a;i<=n;i++){
        in>>a;
        g[a].push_back(i);
    }
    depth[0]=-1;
    dfs(1,0);
    build_rmq();
    for(int i=1,a,b;i<=m;i++){
        in>>a>>b;
        out<<ans(a,b)<<'\n';
    }
    return 0;
}