Cod sursa(job #1660063)

Utilizator bogdan2510Ionut Bogdan bogdan2510 Data 22 martie 2016 19:33:38
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int M[30][400020],nM,First[100005],n,L[400020],m,H[100005];
vector <int> V[100005];
void dfs(int nod,int lv){
    M[0][++nM]=nod;
    H[nod]=lv;
    if(!First[nod]){
        First[nod]=nM;
    }
    for(int i=0;i<V[nod].size();i++){
        dfs(V[nod][i],lv+1);
        M[0][++nM]=nod;
        H[nod]=lv;
    }
}
void read(){
    f>>n>>m;int x;
    for(int i=2;i<=n;i++){
        f>>x;
        V[x].push_back(i);
    }
}
void rmq(){

    for(int i=1;(1<<i)<=nM;i++){
        for(int j=1;j+(1<<i)<=nM;j++){
            int l=1<<(i-1);
            int a=M[i-1][j],b=M[i-1][j+l];
            if(H[a]<H[b]){
                M[i][j]=a;
            }else{
                M[i][j]=b;
            }
        }
    }
}
void p2(){
    L[1]=0;
    for(int i=2;i<=nM;i++){
        L[i]=L[i/2]+1;
    }
}
int main()
{
    read();
    dfs(1,0);
    rmq();
    p2();int x,y;
    for(int i=0;i<m;i++){
        f>>x>>y;
        int a,b;
        a=First[x];
        b=First[y];
        if(a>b){
            swap(a,b);
        }
        int z=b-a+1;
        int l=L[z];
        a=M[l][a];;
        b=M[l][b-(1<<l)+1];
        if(H[a]<H[b]){
            g<<a;
        }else{
            g<<b;
        }
        g<<"\n";
    }
    return 0;
}