Cod sursa(job #2850476)

Utilizator GligarEsterabadeyan Hadi Gligar Data 16 februarie 2022 20:27:35
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

const int nmax=100000, nmax2=16;

vector <int> g[nmax+1];

int v[nmax2+1][nmax+1], lg[nmax+1], pv[nmax+1];

int poz=0;
void dfs(int x){
    poz++;
    v[0][poz]=x;
    pv[x]=poz;
    for(int i=0;i<int(g[x].size());i++){
        int xn=g[x][i];
        if(pv[xn]==0){
            dfs(xn);
            poz++;
            v[0][poz]=x;
        }
    }
}

int Min(int a, int b){
    if(a<=b){
        return a;
    }else{
        return b;
    }
}

int main(){
    int n,m;
    fin>>n>>m;
    for(int i=2;i<=n;i++){
        int x;
        fin>>x;
        g[x].push_back(i);
        g[i].push_back(x);
    }
    dfs(1);
    for(int i=2;i<=nmax;i++){
        lg[i]=lg[i/2]+1;
    }
    n=poz;
    for(int i=1;i<=lg[n];i++){
        for(int j=1;j<=n-(1<<i)+1;j++){
            v[i][j]=Min(v[i-1][j],v[i-1][j+(1<<(i-1))]);
        }
    }
    /*for(int i=1;i<=30;i++){
        fout<<v[0][i]<<" ";
    }
    fout<<"\n";
    for(int i=1;i<=30;i++){
        fout<<pv[i]<<" ";
    }*/
    for(int i=1;i<=m;i++){
        int x,y;
        fin>>x>>y;
        x=pv[x];
        y=pv[y];
        int log2=lg[y-x+1];
        fout<<Min(v[log2][x],v[log2][1+y-(1<<log2)])<<"\n";
    }
    return 0;
}