Cod sursa(job #2306940)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 23 decembrie 2018 12:50:08
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.91 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <cmath>

using namespace std;

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

const int NMAX = 100005;

vector<int> g[NMAX];
int h[NMAX], dad[NMAX];

void dfs(int node) {
    for(auto it : g[node]) {
        if(h[it] == 0) {
            h[it] = h[node] + 1;
            dad[it] = node;
            dfs(it);
        }
     }
}

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

    h[1] = 1;
    dfs(1);

    for(int qr = 1; qr <= m; qr ++) {
        int x, y;
        in >> x >> y;

        while(x != y) {
            if(h[x] > h[y])
                x = dad[x];
            else
                y = dad[y];
        }

        out << x << "\n";
    }

    return 0;
}