Cod sursa(job #2409754)

Utilizator osiaccrCristian Osiac osiaccr Data 19 aprilie 2019 13:07:02
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>
#define DEF 100010
#define INF 1 << 29

using namespace std;

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

int n, m, T[DEF], First[DEF];

vector < int > L[DEF];

vector < pair < int, int > > Euler;

void dfs (int nod, int niv) {

    Euler.push_back ({nod, niv});
    First[nod] = Euler.size () - 1;


    for (int it : L[nod]) {
        dfs (it, niv + 1);
        Euler.push_back ({nod, niv});
    }
}

int main () {

    fin >> n >> m;

    for (int i = 2; i <= n; ++ i) {
        fin >> T[i];
        L[T[i]].push_back (i);
    }

    dfs (1, 0);

    for (int i = 1; i <= m; ++ i) {
        int x, y, minim = INF, nod;
        fin >> x >> y;

        if (First[x] > First[y]) {
            swap (x, y);
        }

        for (int i = First[x]; i <= First[y]; ++ i) {
            if (Euler[i].second < minim) {
                minim = Euler[i].second;
                nod = Euler[i].first;
            }
        }

        fout << nod << "\n";
    }

    return 0;
}