Cod sursa(job #2289542)

Utilizator CronosClausCarare Claudiu CronosClaus Data 24 noiembrie 2018 19:27:04
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;

const int mxn = 100 * 1000 + 10;

vector< int > g[ mxn ];

int v[ 2 * mxn ];
int p = 1;

int rmq[ 20 ][ 2 * mxn ];

int poz[ mxn ];

int n, q;

int pmx;

void euler(int nod){
    v[ p++ ] = nod;
    poz[ nod ] = p - 1;
    if(g[ nod ].size()){
        for(auto it: g[ nod ]){
            euler( it );
            v[ p++ ] = nod;
        }
    }
}

int main()
{
    ifstream cin("lca.in");
    ofstream cout("lca.out");
    cin>> n >> q;
    for(int i = 2, x; i <= n; i++){
        cin>> x;
        g[ x ].push_back( i );
    }
    euler( 1 );
    p--;
    for(int i = 1; i <= p; i++)
        rmq[ 0 ][ i ] = v[ i ];

    for(int k = 1; (1 << k) < p; k++){
        pmx = (1 << k);
        for(int i = 1; i + pmx - 1 <= p; i++){
            rmq[ k ][ i ] = min(rmq[ k - 1 ][ i ], rmq[ k - 1 ][ i + (pmx >> 1)]);
        }
    }
    for(int i = 1, x, y; i <= q; i++){
        cin>> x >> y;
        x = poz[ x ];
        y = poz[ y ];
        if(x > y)
            swap(x, y);
        int k = log2(y - x + 1);
        cout<< min(rmq[ k ][ x ], rmq[ k ][ y - (1 << k) + 1] )<< '\n';
    }
    return 0;
}