Cod sursa(job #2886218)

Utilizator ioana.jianuIoana Jianu ioana.jianu Data 7 aprilie 2022 12:45:15
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1e5+5;
const int KMAX = 2e5+5;
int k, euler[KMAX], niv[NMAX], firstap[NMAX], rmq[20][KMAX], logg2[KMAX];
vector<int> v[NMAX];

void dfs(int nod, int h) {
    k++;
    euler[k] = nod;
    niv[nod] = h;
    firstap[nod] = k; ///mereu prima aparitie e aici
    for (int fiu : v[nod]) {
        dfs(fiu, h + 1);
        k++;
        euler[k] = nod;
       // niv[k] = h;
    }
}

int main() {

    int n, m;

    fin >> n >> m;
    for (int i = 2; i <= n; i++) {
        int x;
        fin >> x;
        v[x].push_back(i);
    }
    dfs(1, 0);
/*
    for (int i = 1; i <= k; i++)
        fout << euler[i] << " ";
    fout << "\n";
    for (int i = 1; i <= k; i++)
        fout << niv[i] << " ";
*/
    for (int i = 2; i <= max(n, k); i++)
        logg2[i] = logg2[i / 2] + 1;

    for (int j = 1; j <= k; j++)
        rmq[0][j] = euler[j];
    for (int j = 1; j <= k; j++) {
        for (int i = 1; (1 << i) <= j; i++) {
            if (niv[rmq[i - 1][j - (1 << (i - 1))]] < niv[rmq[i - 1][j]])
                rmq[i][j] = rmq[i - 1][j - (1 << (i - 1))];
            else
                rmq[i][j] = rmq[i - 1][j];
        }
    }

    for (int qq = 1; qq <= m; qq++) {
        int x, y;
        fin >> x >> y;
        int a = firstap[x];
        int b = firstap[y];
        if (a > b)
            swap(a, b);
        int l = logg2[b - a + 1];
        int rez;
        if (niv[rmq[l][a + (1 << l) - 1]] < niv[rmq[l][b]])
            rez = rmq[l][a + (1 << l) - 1];
        else
            rez = rmq[l][b];
        fout << rez << "\n";
    }



    return 0;
}