Cod sursa(job #3218257)

Utilizator Dani111Gheorghe Daniel Dani111 Data 26 martie 2024 18:00:32
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <bits/stdc++.h>
using namespace std;

const int LOG = 20;
const int MAX = 1000;
int N, M, x;
bool v[MAX + 3];
int level[MAX + 3];
int up[MAX + 3][LOG + 3];
int w1, w2;
int Q;


void dfs(int nod, vector<int>G[]) {
    v[nod] = true;

    for(auto i : G[nod]) {
        if(!v[i]) {
            level[i] = level[nod] + 1;
            up[i][0] = nod;
            for(int j = 1; j <= LOG; j++) {
                up[i][j] = up[up[i][j - 1]][j - 1];
            }
            dfs(i, G);
        }
    }
}

void test_case() {
    vector<int>G[MAX + 3];
    memset(level, 0, sizeof(level));
    memset(v, 0, sizeof(v));
    cin >> N;
    cin >> Q;
    for(int i = 2; i <= N; i++) {
        cin >> x;
        G[x].push_back(i);
        G[i].push_back(x);
    }

    dfs(1, G);
    
    // for(int i = 1; i <= N; i++) {
    //     for(int j = 0; j <= LOG; j++) {
    //         cout << up[i][j] << ' ';
    //     }

    //     cout << '\n';
    // }

    

    for(int i = 1; i <= Q; i++) {
        cin >> w1 >> w2;  
        if(level[w2] > level[w1]) swap(w1, w2);

        int k = level[w1] - level[w2];       
        for(int j = 0; j <= LOG; j++) {
            if(k & (1 << j)) {
                w1 = up[w1][j];
            }
        }

        if(w1 == w2) {
            cout << w1 << '\n';
            continue;
        }

        for(int j = 0; j <= LOG; j++) {
            if(up[w1][j] != up[w2][j]) {
                
                w1 = up[w1][j];
                w2 = up[w2][j];
            }
        }
        //cout << w1 << ' ' << w2 << '\n';
        cout << up[w1][0] << '\n';
    }
}

int main() {
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);

    int T = 1;
    //cin >> T;

    while(T--) {
        test_case();
    }
}