Cod sursa(job #2306952)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 23 decembrie 2018 13:31:44
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 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);

    vector<int> lg(n + 1, 0);
    for(int i = 2; i <= n; i ++)
        lg[i] = 1 + lg[i >> 1];

    vector<vector<int>> dp(lg[n] + 1, vector<int> (n + 1, 0));
    for(int i = 1; i <= n; i ++)
        dp[0][i] = dad[i];

    for(int p = 1; p <= lg[n]; p ++)
        for(int i = 1; i <= n; i ++)
            dp[p][i] = dp[p - 1][dp[p - 1][i]];

    for(int qr = 1; qr <= m; qr ++) {
        int x, y;
        in >> x >> y;
        if(h[x] < h[y])
            swap(x, y);

        for(int step = lg[n]; step >= 0; step --)
            if(h[dp[step][x]] >= h[y])
                x = dp[step][x];

        for(int step = lg[n]; step >= 0; step --)
            if(dp[step][x] != dp[step][y] && dp[step][x] != 0 && dp[step][y] != 0) {
                x = dp[step][x];
                y = dp[step][y];
            }
        if(x != y)
            x = dad[x];

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

    return 0;
}