Cod sursa(job #2721511)

Utilizator mihnea.anghelMihnea Anghel mihnea.anghel Data 11 martie 2021 21:30:40
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <vector>
#define f in
#define g out

using namespace std;
ifstream in ( "lca.in" );
ofstream out( "lca.out" );
vector<int> L[100100];
int n, m, i, j, k, x, y, px, py, val;
int v[200200], poz[100100], niv[100100], p[200200];
pair<int, int> d[100100][20], sol;

void dfs ( int nod ){
    v[++k] = nod;
    poz[nod] = k;
    for ( auto vecin : L[nod] ){
        niv[vecin] = 1+niv[nod];
        dfs(vecin);
        v[++k] = nod;
    }
}

int main() {
    f>>n>>m;
    for ( i=2; i <= n; i++ ){
        f>>x;
        L[x].push_back(i);
    }
    niv[1] = 1;
    dfs(1);
    for ( i=2; i <= k; i++ )
        p[i] = p[i/2]+1;
    for ( i=1; i <= k; i++ )
        d[i][0] = {niv[v[i]],i};
    
    for ( j=1; (1<<j) <= k; j++ )
        for ( i=1; i <= k; i++ ) {
            d[i][j] = d[i][j-1];
            val = i+(1<<(j-1));
            if ( val <= k && d[val][j-1].first < d[i][j].first )
                d[i][j] = d[val][j-1];
        }


    for ( ; m--; ){
        f>>x>>y;
        px = poz[x];
        py = poz[y];
        if ( px > py )
            swap(px, py);
        val = p[py-px+1];
        sol = min ( d[px][val], d[py-(1<<val)+1][val] );
        g<<v[sol.second]<<"\n";
    }
    return 0;
}