Cod sursa(job #2786687)

Utilizator AlexNicuNicu Alexandru AlexNicu Data 21 octombrie 2021 15:11:22
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#include <vector>

using namespace std;

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

#define NMAX 100000
#define POW2MAX 18

vector<int> arbore[NMAX];
int euler[2 * NMAX + 1];
int heuler[2 * NMAX + 1];
int poz_euler[2 * NMAX + 1];
int logg2[2 * NMAX + 1];
int poz;

int rmq[2 * NMAX + 1][POW2MAX];;

void DFS ( int nod, int inaltime ) {
    euler[poz] = nod;
    poz_euler[nod] = poz;
    heuler[poz++] = inaltime;
    for ( auto copil: arbore[nod] ) {
        DFS(copil, inaltime + 1);
        euler[poz] = nod;
        poz_euler[nod] = poz;
        heuler[poz++] = inaltime;
    }
}

int main() {
    int n, m, i, j, tata, a, b, poz1, poz2, lungime;
    cin >> n >> m;
    for ( i = 1; i < n; i++ ) {
        cin >> tata;
        arbore[tata].push_back(i + 1);
    }
    euler[poz] = 1;
    heuler[poz++] = 0;
    poz_euler[0] = 1;
    DFS(1, 1);
    for ( i = 2; i <= poz; i++ )
        logg2[i] = logg2[i / 2] + 1;
    for ( i = 1; i <= poz; i++ ) {
        rmq[i][1] = i;
    }
    for ( j = 2; j <= logg2[poz]; j++ ) {
        for ( i = ( 1 << ( j - 1 ) ) + 1; i <= poz; i++ ) {
            if ( heuler[rmq[i - (1 << (j - 1))][j - 1]] < heuler[rmq[i][j - 1]] )
                rmq[i][j] = rmq[i - (1 << (j - 1))][j - 1];
            else
                rmq[i][j] = rmq[i][j - 1];
        }
    }
    for ( i = 1; i <= m; i++ ) {
        cin >> a >> b;
        poz1 = min ( poz_euler[a], poz_euler[b] );
        poz2 = max ( poz_euler[a], poz_euler[b] );
        lungime = poz2 - poz1 + 1;
        lungime = logg2[lungime];
        if ( heuler[rmq[poz1 + ( 1 << lungime ) - 1][lungime]] < heuler[rmq[poz2][lungime]] )
            cout << euler[rmq[poz1 + ( 1 << lungime ) - 1][lungime]] << "\n";
        else
            cout << euler[rmq[poz2][lungime]] << "\n";
    }
    return 0;
}