Cod sursa(job #2554775)

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