Cod sursa(job #2505012)

Utilizator Bogdan_BuzatuBuzatu Bogdan Mihai Bogdan_Buzatu Data 5 decembrie 2019 23:12:56
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,l[200010],a[40][200010],putere,x,y,level[200010],euler[200010],poz[200010],len,putere1;
vector<int> v[200010];
void dfs(int nod,int niv){
    len++;
    level[len]=niv;
    euler[len]=nod;
    poz[nod]=len;

    for(int i=0;i<v[nod].size();i++){
        dfs(v[nod][i],niv+1);
        len++;
       level[len]=niv;
        euler[len]=nod;

    }


}
int main(){
    fin>>n>>m;
    for(int i=2;i<=n;i++){
        fin>>x;
        v[x].push_back(i);

    }
    dfs(1,1);
    for(int i=2;i<=len;i++){
        l[i]=l[i/2]+1;
     }

    for(int i=1;i<=len;i++){
        a[0][i]=i;

    }
    for(int i=1;i<=l[len]+1;i++){
        putere=(1<<(i-1));
        for(int j=1;j<=len-(1<<i)+1;j++){
            a[i][j]=a[i-1][j];
            if(level[ a[i][j] ]>level[ a[i-1][j+putere] ]){
                a[i][j]=a[i-1][j+putere];
            }

        }
    }
    for(int i=1;i<=m;i++){
        fin>>x>>y;
        x=poz[x];
        y=poz[y];
        if(x>y){
            swap(x,y);
        }

        putere=l[y-x+1];
        putere1=y-(1<<putere)+1;
        if(level[a[putere][x]]<level[a[putere][putere1]]){
            fout<<euler[a[putere][x]]<<"\n";
        }
        else{
            fout<<euler[a[putere][putere1]]<<"\n";
        }
    }



}