Cod sursa(job #2279950)

Utilizator Andrei17Andrei Pascu Andrei17 Data 10 noiembrie 2018 10:32:27
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int N = 100001;

int n, m, t[N], s[31][N], ti[N], to[N], timp;
vector <int> fii[N];

void dfs(int x) {
    ti[x] = ++timp;
    for (size_t i = 0; i < fii[x].size(); i++) {
        int y = fii[x][i];
        dfs(y);
    }
    to[x] = ++timp;
}

bool stramos(int x, int y) {
    return (ti[x] <= ti[y] && to[x] >= to[y]);
}

int lca(int x, int y) {
    if (x == 1 || y == 1) return 1;
    int pas = 30;
    while (pas >= 0) {
        if (s[pas][x] != 0 && !stramos(s[pas][x], y)) x = s[pas][x];
        pas--;
    }
    return s[0][x];
}

int main()
{
    in >> n >> m;
    t[1] = 0;
    for (int i = 2; i <= n; i++) {
        in >> t[i];
        s[0][i] = t[i];
        fii[t[i]].push_back(i);
    }
    dfs(1);

    /// s[i][j] = s[i - 1][ s[i - 1][j] ]
    for (int i = 1; i <= 30; i++) {
        for (int j = 1; j <= n; j++) s[i][j] = s[i - 1][ s[i - 1][j] ];
    }

    int a, b;
    for (int i = 0; i < m; i++) {
        in >> a >> b;
        out << lca(a, b) << '\n';
    }

    in.close();
    out.close();
    return 0;
}