Cod sursa(job #2499927)

Utilizator MihneaGhiraMihnea MihneaGhira Data 26 noiembrie 2019 23:04:55
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
long int n,m,k,x,y,pow2,pow;
long int a[18][200002],log[200002],euler[200002],nivel[200002],poz[200002];
vector<int> L[200002];

void dfs(int nod,int niv){
    nivel[++k]=niv;
    euler[k]=nod;
    poz[nod]=k;
    for(int i=0;i<L[nod].size();i++){
        dfs(L[nod][i],niv+1);
        k++;
        nivel[k]=niv;
        euler[k]=nod;
    }

}


int main () {
    fin>>n>>m;
    for(int i=2;i<=n;i++){
        fin>>x;
        L[x].push_back(i);
    }
    ///
    dfs(1,1);
    ///
    for(int i=2;i<=k;i++){
        log[i]=log[i/2]+1;
    }

    for(int i=1;i<=k;i++){
        a[0][i]=i;
    }
    for(int i=1; (1<<i) <=k;i++){
        for(int j=1;j<=k- (1<<i) +1;j++){
            pow=1<<(i-1);
            a[i][j]=a[i-1][j];
            if(nivel[ a[i][j] ]>nivel[ a[i-1][j+pow] ]){
                a[i][j]=a[i-1][j+pow];
            }
        }
    }
    for(int i=1;i<=m;i++){
        fin>>x>>y;
        x=poz[x];
        y=poz[y];
        if(x>y){
            int aux=x;
            x=y;
            y=aux;
        }

        pow=log[y-x+1];
        pow2=y-(1<<pow)+1;
        if(nivel[a[pow][x]]<nivel[a[pow][pow2]]){
            fout<<euler[ a[pow][x] ]<<"\n";
        }
        else{
            fout<<euler[ a[pow][pow2] ]<<"\n";
        }
    }
    return 0;
}