Cod sursa(job #3341529)

Utilizator BidonTurtitBezdedan Eric BidonTurtit Data 19 februarie 2026 20:36:43
Problema Lowest Common Ancestor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#define NMax 100005
#define LMax 18
using namespace std;

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

vector<int> vecini[NMax];
bitset<NMax> v;

int n, m;
int e[NMax*2], level[NMax*2], first[NMax], lg[NMax], cnt;
int rmq[LMax+1][2*NMax];

void dfs(int nod, int l) {
    e[++cnt] = nod;
    level[cnt] = l;
    if(!v[nod]) {
        v[nod] = 1;
        first[nod] = cnt;
    }
    for(auto child : vecini[nod]) {
        dfs(child, l+1);
        e[++cnt] = nod;
        level[cnt] = l;
    }
}

int main() {
    fin >> n >> m;
    lg[1] = 0;
    for(int i=2; i<=2*n; i++)
        lg[i] = lg[i/2]+1;
    for(int i=2; i<=n; i++) {
        int x;
        fin >> x;
        vecini[x].push_back(i);
    }
    cnt = 0;
    dfs(1, 0);
    for(int i=1; i<=2*n-1; i++)
        rmq[0][i] = i;

    for(int j=1; (1<<j) <= 2*n-1; j++) {
        for(int i=1; i + (1<<j) -1 <= 2*n-1; i++) {
            int a = rmq[j-1][i];
            int b = rmq[j-1][i + (1<<(j-1))];
            rmq[j][i] = (level[a] <= level[b] ? a : b);
        }
    }
    for(int i=1; i<=m; i++) {
        int x, y;
        fin >> x >> y;
        x = first[x];
        y = first[y];
        if(x > y) swap(x, y);
        int len = y - x + 1;
        int k = lg[len];
        int a = rmq[k][x];
        int b = rmq[k][y - (1<<k) + 1];
        int ind = (level[a] <= level[b] ? a : b);
        fout << e[ind] << "\n";
    }
}