Cod sursa(job #2720006)

Utilizator marius004scarlat marius marius004 Data 10 martie 2021 15:18:30
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.79 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream f("lca.in");
ofstream g("lca.out");

const int NMAX = 100001;

int n, m, tree[NMAX], level[NMAX];
vector < int > G[NMAX];

void dfs(int node, int l) {

    level[node] = l;

    for(auto& it : G[node])
        dfs(it, l + 1);
}

int main() {

    f >> n >> m;

    for(int i = 2;i <= n;++i) {
        f >> tree[i];
        G[ tree[i] ].push_back(i);
    }

    dfs(1, 0);

    for(;m--;) {

        int x, y;
        f >> x >> y;

        for(;level[x] != level[y];) {
            if(level[x] > level[y])
                x = tree[x];
            else
                y = tree[y];
        }

        for(;x != y;) {
            x = tree[x];
            y = tree[y];
        }

        g << x << '\n';
    }

    return 0;
}