Cod sursa(job #2403418)

Utilizator topala.andreiTopala Andrei topala.andrei Data 11 aprilie 2019 15:47:12
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
#define MAXN 100001
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> G[MAXN];
int T[MAXN], T2[MAXN];
int lvl[MAXN];
int N, M, H;
void read() {
    int x;
    f >> N >> M;
    for (int i = 1; i < N; ++i) {
        f >> x;
        G[x].push_back(i + 1);
        T[i + 1] = x;
    }
}
void DFS(int node, int level) {
    H = max(H, level);
    for (int i = 0; i < G[node].size(); ++i) {
        DFS(G[node][i], level + 1);
    }
}
void getBuckets(int node, int tata, int level) {
    T2[node] = tata;
    lvl[node] = level;
    if (level % H == 0) {
        tata = node;
    }
    for (int i = 0; i < G[node].size(); ++i) {
        getBuckets(G[node][i], tata, level + 1);
    }
}
int main()
{
    int x, y;
    read();
    DFS(1, 1);
    H = sqrt(H);
    getBuckets(1, 0, 0);
    for (int i = 1; i <= M; ++i) {
        f >> x >> y;
        while (T2[x] != T2[y]) {
            if (lvl[x] < lvl[y]) {
                y = T2[y];
            } else {
                x = T2[x];
            }
        }
        while (x != y) {
            if (lvl[x] < lvl[y]) {
                y = T[y];
            } else {
                x = T[x];
            }
        }
        g << x<< '\n';
    }
    return 0;
}