Cod sursa(job #2964359)

Utilizator KarinaDKarina Dumitrescu KarinaD Data 12 ianuarie 2023 20:57:33
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <vector>

using namespace std;

#define MAXN 100005
#define LOG_MAXN 20

struct node {
    int depth;
    int par[LOG_MAXN];
    vector <int> chd;
};

node tree[MAXN];

void Init(int pos) {

    int i;
    for ( i = 1; tree[pos].par[i - 1] != -1 && i < LOG_MAXN; i++ )
        tree[pos].par[i] = tree[tree[pos].par[i - 1]].par[i - 1];
    tree[pos].par[i] = -1;

    if(tree[pos].par[0] == -1) {
        tree[pos].depth = 0;
    }
    else {
        tree[pos].depth = tree[tree[pos].par[0]].depth + 1;
    }
    
    for ( int i = 0; i < tree[pos].chd.size (); i++ ){
        if ( tree[pos].chd[i] == tree[pos].par[0] )
            continue;
        Init ( tree[pos].chd[i] );
    }
}

int LCA(int pos1, int pos2) {
    
    if ( tree[pos1].depth > tree[pos2].depth )
        swap ( pos1, pos2 );

    for ( int bit = LOG_MAXN - 1; bit >= 0; bit--) {
        if ( ( ( tree[pos2].depth - tree[pos1].depth ) & (1 << bit) ) != 0) {
            pos2 = tree[pos2].par[bit];
        }
    }

    if(pos1 == pos2) {
        return pos1;
    }
    
    for ( int bit = LOG_MAXN - 1; bit >= 0; bit-- ){
        if ( tree[pos2].par[bit] != tree[pos1].par[bit] ){
            pos1 = tree[pos1].par[bit];
            pos2 = tree[pos2].par[bit];
        }
    }
    return tree[pos1].par[0];
}

int main() {
    ifstream fin("lca.in");
    ofstream fout("lca.out");
    
    int n, q;
    int pos1, pos2;
    fin >> n >> q;
    tree[0].par[0] = -1;
    for(int i = 1; i < n; i++) {
        fin >> tree[i].par[0];
        tree[i].par[0]--;
        tree[tree[i].par[0]].chd.push_back(i);
    }
    Init(0);
    for(int i = 0; i < q; i++) {
        fin >> pos1 >> pos2;
        pos1--;
        pos2--;
        fout << LCA(pos1, pos2) + 1 << '\n';
    }
}