Cod sursa(job #2926261)

Utilizator Theodor17Pirnog Theodor Ioan Theodor17 Data 17 octombrie 2022 16:08:51
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin("lca.in");
ofstream cout("lca.out");

const int NMAX = 1e5;
int t[22][NMAX + 1], ti[NMAX + 1], to[NMAX + 1], emax[NMAX + 1], n, m, x, y, timp;
vector <int> fii[NMAX + 1];

void rmq(){

    for(int i = 1; (1 << i) <= n; i++){
        for(int j = 1; j <= n; j++){

            t[i][j] = t[i - 1][t[i - 1][j]];

            if(t[i][j])
                emax[j] = i;

        }
    }

}

void dfs(int x){

    ti[x] = ++timp;

    for(auto y : fii[x])
        dfs(y);

    to[x] = ++timp;

}

bool stramos(int x, int y){
    return (ti[x] <= ti[y] && to[x] >= to[y]);
}

int lca(int x, int y){

    if(stramos(x, y))
        return x;

    for(int e = emax[x]; e >= 0; e--)
        if(t[e][x] && !stramos(t[e][x], y))
            x = t[e][x];

    return t[0][x];
}

int main(){

    cin.tie(0)->sync_with_stdio(0);cout.tie(0);

    cin >> n >> m;
    for(int i = 2; i <= n; i++){

        cin >> t[0][i];
        fii[t[0][i]].push_back(i);

    }

    rmq();
    dfs(1);

    for(int i = 0; i < m; i++){

        cin >> x >> y;
        cout << lca(x, y) << "\n";

    }


    return 0;
}