Cod sursa(job #2207823)

Utilizator EclipseTepes Alexandru Eclipse Data 26 mai 2018 21:48:10
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <math.h>
#include <vector>
#include <string.h>
#define dMAX 100000

using namespace std;

int n, m, t, p, q;
int first[dMAX * 2 + 2];
int sparseTable[2 * dMAX][(int)log2(2 * dMAX) + 1];

pair<int, int> reprEuler[dMAX * 2 + 2];
int idx;

vector<int> graf[dMAX + 2];

char s[15];
int id;

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

void DFS(int v, int niv) {
    reprEuler[++idx] = {v, niv};
    first[v] = idx;
    int newV, u;
    for (u = 0; u < graf[v].size(); u++) {
        newV = graf[v][u];
        DFS(newV, niv + 1);
        reprEuler[++idx] = {v, niv};
    }
}

void MakeTable() {
    int i, j, l, r;
    for (i = 1; i <= idx; i++) sparseTable[i][0] = i;
    for (j = 1; (1 << j) <= idx; j++) {
        for (i = 1; i + (1 << j) - 1 <= idx; i++) {
            l = sparseTable[i][j - 1];
            r = sparseTable[i + (1 << (j - 1))][j - 1];
            if (reprEuler[l].second < reprEuler[r].second) {
                sparseTable[i][j] = l;
            } else
                sparseTable[i][j] = r;
        }
    }
}

int RMQ(int low, int r) {
    int l = r - low + 1;
    int k = (int)log2(l);
    int t1, t2;
    t1 = sparseTable[low][k];
    t2 = sparseTable[low + l - (1 << k)][k];
    if (reprEuler[t1].second < reprEuler[t2].second) {
        return reprEuler[t1].first;
    } else return reprEuler[t2].first;
}

int LCA(int x, int y) {
    int a = first[x], b = first[y];
    if (a > b) swap(a, b);
    return RMQ(a, b);
}

void GetInt(int &t) {
    t = 0;
    while (isdigit(s[id])) {
        t *= 10;
        t += (int)s[id] - '0';
        id++;
    }
    id++;
}

int main()
{
    int i, j;
    fin >> n >> m;
    for (i = 2; i <= n; i++) {
        fin >> t;
        graf[t].push_back(i);
    }
    DFS(1, 0);
    MakeTable();
    for (i = 1; i <= m; i++) {
        fin >> p >> q;
        fout << LCA(p, q) << '\n';
    }
    return 0;
}