Cod sursa(job #3164314)

Utilizator elisa.ipateElisa Ipate elisa.ipate Data 2 noiembrie 2023 18:14:19
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <vector>
#include <iostream>


using namespace std;

#define nmax 100005

int parent[20][nmax], adancime[nmax], v[nmax];


int stramos( int p, int q ) {
    //p-lea stramos al lui q
    int j;
    for( j = 17; j >= 0; j-- ) {
        if( (1 << j) <= p ) {
            q = parent[j][q];
            p -= (1 << j);
        }

    }
    return q;
}

int main() {
    //ifstream cin("lca.in");
    //ofstream cout("lca.out");
    int n, i, j, m, x, y;
    cin >> n >> m;
    for( i = 2; i <= n; i++ ) {
        cin >> v[i];
        parent[0][i] = v[i];
        adancime[i] = adancime[v[i]] + 1;
    }


    for( i = 1; i < 18; i++ ) {
        for( j = 1; j <= n; j++ )
            parent[i][j] = parent[i-1][parent[i-1][j]];
    }


    for( i = 0; i < m; i++ ) {
        cin >> x >> y;
        //cout << "test " << i << " " << adancime[x] << " " << adancime[y] << "\n";
        if( adancime[x] > adancime[y] )
            x = stramos( adancime[x]-adancime[y], x );
        else
            y = stramos( adancime[y]-adancime[x], y );
        //cout << x << " " << y << "\n";
        for( j = 17; j >= 0; j-- ) {
            if( (1 << j) <= adancime[x] && parent[j][x] != parent[j][y] ) {
                x = parent[j][x];
                y = parent[j][y];
            }

        }
        if( x == y )
            cout << x << "\n";
        else
            cout << parent[0][x] << "\n";
    }

    return 0;
}