Cod sursa(job #2641655)

Utilizator pregoliStana Andrei pregoli Data 12 august 2020 11:39:44
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>
#define newline '\n'
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
///**********************
const int NMAX = 1e5 + 3, H = sqrt(NMAX);
int n, m, d[NMAX], interD[NMAX], level[NMAX];
vector<int> arbor[NMAX];

void read() {
    fin >> n >> m;
    for (int i = 2; i <= n; i++) {
        fin >> d[i];
        arbor[d[i]].push_back(i);
    }
}

void dfs(int node, int interNode, int clevel) {
    interD[node] = interNode;
    level[node] = clevel;
    if (clevel % H == 0)
        interNode = node;
    for (auto it : arbor[node])
        dfs(it, interNode, clevel + 1);
}

int lca(int x, int y) {
    while (interD[x] != interD[y])
        if (level[x] > level[y])
            x = interD[x];
        else
            y = interD[y];

    while (x != y)
        if (level[x] > level[y])
            x = d[x];
        else
            y = d[y];
    return x;
}

int main() {
    read();
    dfs(1, 0, 0);
    while (m--) {
        int x, y;
        fin >> x >> y;
        fout << lca(x, y) << newline;
    }
    fout.close();
    return 0;
}