Cod sursa(job #1998747)

Utilizator savigunFeleaga Dragos-George savigun Data 8 iulie 2017 23:41:05
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;


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

const int MAXN = 1e5 + 5;
int n, m;
int level[MAXN], parent[MAXN];
vector<int> g[MAXN];





void set_level(int x, int depth) {
    level[x] = depth;
    for (int i = 0; i < g[x].size(); ++i) {
        set_level(g[x][i], depth + 1);
    }
}

int query(int x, int y) {
    while (x != y) {
        if (level[x] < level[y]) swap(x, y);
        x = parent[x];
    }
    return x;
}


int main()
{
    in >> n >> m;

    parent[1] = 0;
    level[0] = 0;

    for (int i = 2, x; i <= n; ++i) {
        in >> x;
        parent[i] = x;
        g[x].push_back(i);
    }

    set_level(1, 1);

    for (int i = 1, x, y; i <= m; ++i) {
        in >> x >> y;
        out << query(x, y) << "\n";
    }

    return 0;
}