Cod sursa(job #2555004)

Utilizator luci.tosaTosa Lucian luci.tosa Data 23 februarie 2020 16:32:31
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 100005
#define LOGMAX 18
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,top=0;
int depth[NMAX],euler[2*NMAX],index[NMAX],M[LOGMAX][2*NMAX],log[2*NMAX];
vector <int> g[NMAX];
void dfs(int nod) {
    euler[++top]=nod;
    index[nod]=top;
    for(int i=0; i<(int)g[nod].size(); i++) {
        int aux=g[nod][i];
        depth[aux]=depth[nod]+1;
        dfs(aux);
        euler[++top]=nod;
    }
}
void logarithm() {
    log[1]=0;
    for(int i=2; i<=2*n-1; i++)
        log[i]=log[i/2]+1;
}
int minim(int a,int b) {
    if(depth[a]<depth[b])
        return a;
    else
        return b;
}
void rmq() {
    for(int i=1; i<=top; i++)
        M[0][i]=euler[i];
    for(int i=1; (1<<i)<=top; i++)
        for(int j=1; j+(1<<i)-1<=top; j++)
            M[i][j]=minim(M[i-1][j],M[i-1][j+(1<<(i-1))]);
}
int main() {
    fin>>n>>m;
    logarithm();
    for(int i=2; i<=n; i++) {
        int x;
        fin>>x;
        g[x].push_back(i);
    }
    dfs(1);
    rmq();
    for(int i=1; i<=m; i++) {
        int x,y;
        fin>>x>>y;
        if(index[x]>index[y])
            swap(x,y);
        int k=log[index[y]-index[x]+1];
        int dif=(1<<k)-1;
        fout<<minim(M[k][index[x]],M[k][index[y]-dif])<<"\n";
    }
    return 0;
}