Cod sursa(job #2793710)

Utilizator RaduNichitaRadu Nichita RaduNichita Data 3 noiembrie 2021 21:57:51
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

int main() {
    std::ifstream fin("lca.in");
    std::ofstream fout("lca.out");

    int n, queries;
    std::vector<int64_t> v;
    std::vector<int64_t> p;
    fin >> n >> queries;
    v.resize(n + 1);
    p.resize(n + 1);

    for (int i = 2; i <= n; i++) {
        int x;
        fin >> x;
        v[i] = v[x] + 1;
        p[i] = x; 
    }

    for (int i = 0; i < queries; ++i) {
        int x, y;
        fin >> x >> y;

        if (x == y) {
            fout << x << "\n";
            continue;
        }

        if (x == 1 || y == 1) {
            fout << 1 << "\n";
            continue;
        }

        while (p[x] != p[y]) {
            if (v[x] < v[y]) {
                y = p[y];
            } else if (v[x] > v[y]) {
                x = p[x];
            } else {
                if (x == y) {
                    break;
                }

                if (p[x] == p[y]) {
                    break;
                }
                x = p[x];
                y = p[y];
            }

            if (p[x] == y) {
                break;
            } 

            if (p[y] == x) {
                break;
            }
        }
        fout << p[x] << "\n";
    }

    fin.close();
    fout.close();
    return 0;
}