Cod sursa(job #3323617)

Utilizator 1gbr1Gabara 1gbr1 Data 18 noiembrie 2025 21:35:09
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <random>
#include <fstream>
#include <bitset>
#include <map>
using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> L[100002];
int dp[18][100001];
int lvl[100001];
void dfs(int nod) {
    for (auto it:L[nod])
            lvl[it]=1+lvl[nod],dfs(it);
}
int kstramos(int val,int k) {
    int sol=val;
    for (int i=0; (1<<i)<=k; i++)
        if ((1<<i) & k)
            val=dp[i][val];
    return val;
}
int lca(int x, int y) {
    int st=0,dr=min(lvl[x],lvl[y]);
    int sol=0;
    while (st<=dr) {
        int mij=(st+dr)/2;
        int val1=kstramos(x,lvl[x]-mij);
        int val2=kstramos(y,lvl[y]-mij);
        if (val1==val2)
            sol=val1,st=mij+1;
        else
            dr=mij-1;
    }
    return sol;
}
int main() {
    int n,q;
    fin>>n>>q;
    dp[0][1]=1;
    for (int i=2; i<=n; i++) {
        fin>>dp[0][i];
        L[dp[0][i]].push_back(i);
    }
    dfs(1);
    for (int i=1; (1<<i)<=n; i++)
        for (int j=1; j<=n; j++)
            dp[i][j]=dp[i-1][dp[i-1][j]];
    while (q--) {
        int x,y;
        fin>>x>>y;
        fout<<lca(x,y)<<"\n";
    }
    return 0;
}