Cod sursa(job #1812979)

Utilizator CTI_KnightCir Constantin CTI_Knight Data 22 noiembrie 2016 16:43:30
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
// CTI

#include <fstream>
#include <algorithm>
#include <vector>
#include <stack>
#include <string>

using namespace std;

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

vector <int> a[100005];
int v[100005], l[100005], tata[100005];

void dfs(int nod, int tnod, int nivel) {
    l[nod]    = nivel;
    tata[nod] = tnod;
    for (int i = 0; i < a[nod].size(); ++i) {
        dfs(a[nod][i], nod, nivel + 1);
    }
}

int LCA(int x, int y) {
    while (tata[x] != tata[y]) {
        if (l[x] > l[y]) {
            x = tata[x];
        } else {
            y = tata[y];
        }
    }

    return tata[x];
}

int main()
{
    int n, q; cin >> n >> q;
    for (int i = 2; i <= n; ++i) {
        cin >> v[i];
        a[v[i]].push_back(i);
        l[i] = 0;
    }

    dfs(1, 0 , 0);

    for (int i = 0; i < q; ++i) {
        int x, y;
        cin >> x >> y;
        cout << LCA(x, y) << '\n';
    }



    return 0;
}