Cod sursa(job #3315175)

Utilizator Seba1030Banescu Stefan Sebastian Seba1030 Data 12 octombrie 2025 18:33:55
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.09 kb
#include <bits/stdc++.h>

using namespace std;

struct nod{
    int stramosi[20], adancime;
    vector<int> copii;
};

nod graf[100005];

void dfs( int n ) {
    for ( auto copil : graf[n].copii ) {
        graf[copil].adancime = graf[n].adancime + 1;
        dfs( copil );
    }
}

int lg[100005];
void precalc_log ( int n ) {
    for ( int i = 2; i <= n; i++ ) {
        lg[i] = lg[i / 2] + 1;
    }
}

void egniv ( int &a, int &b ) {
    int ada = graf[a].adancime;
    int adb = graf[b].adancime;
    if ( adb > ada ) {
        swap( a, b );
        swap( ada, adb );
    }
    while ( adb < ada ) {
        int lgniv = lg[ada - adb];
        ada -= ( 1 << lgniv );
        a = graf[a].stramosi[lgniv];
    }
}

int findlca ( int a, int b ) {
    egniv( a, b );
    if( a == b )
        return a;
    int ad = graf[a].adancime;
    for ( int lgput = lg[ad]; lgput >= 0; lgput-- ) {
        if ( graf[a].stramosi[lgput] != graf[b].stramosi[lgput] ) {
            a = graf[a].stramosi[lgput];
            b = graf[b].stramosi[lgput];
        }
    }
    return graf[a].stramosi[0];
}

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

int main() {
    int n, k;
    fin >> n >> k;
    for ( int i = 2; i <= n; i++ ) {
        fin >> graf[i].stramosi[0];
        graf[graf[i].stramosi[0]].copii.push_back( i );
    }
    dfs( 1 );
    precalc_log( n );
    /*
    for ( int nodcur = 1; nodcur <= n; nodcur++ ) {
        graf[nodcur].stramosi[1] = graf[graf[nodcur].stramosi[0]].stramosi[0];
    }
    for ( int nodcur = 1; nodcur <= n; nodcur++ ) {
        graf[nodcur.stramosi[2]] = graf[graf[graf[graf[nodcur].stramosi[0]].stramosi[0]].stramosi[0]].stramosi[0];
    }
    */

    for ( int lgput = 1; lgput <= lg[n]; lgput++ ) {
        for ( int nodcur = 1; nodcur <= n; nodcur++ ) {
            graf[nodcur].stramosi[lgput] = graf[graf[nodcur].stramosi[lgput - 1]].stramosi[lgput - 1];
        }
    }

    for ( int i = 1; i <= k; i++ ) {
        int x, y;
        fin >> x >> y;
        fout << findlca( x, y ) << '\n';
    }

    return 0;
}