Cod sursa(job #3306489)

Utilizator altomMirel Fanel altom Data 11 august 2025 10:51:25
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_map>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

int n, m, i, a, b, cnt;
int lin[200005][2], r[18][200005][2], E[200005];
vector<int> ad[100000];
pair<int, int> um[100005];

void dfs(int nod, int niv){
    cnt++;
    lin[cnt][0]=nod, lin[cnt][1]=niv;
    um[nod].first=um[nod].second=cnt;

    for(int j=0;j<ad[nod].size();j++){
        dfs(ad[nod][j], niv+1);
        cnt++;
        lin[cnt][0]=nod, lin[cnt][1]=niv;
        um[nod].second=cnt;
    }
}

int main()
{
    fin>>n>>m;

    for(i=2;i<=n;i++){
        fin>>a;
        ad[a].push_back(i);
    }

    cnt=0;
    dfs(1, 0);


    E[1]=0;
    for(i=2;i<=cnt;i++){
        E[i]=E[i-1];
        if((i&(i-1))==0){
            E[i]++;
        }
    }

    for(i=1;i<=cnt;i++){
        r[0][i][0]=lin[i][1];
        r[0][i][1]=i;
    }
    for(int p=1;(1<<p)<=cnt;p++){
        for(i=1;i<=cnt;i++){
            if(i+(1<<(p-1))<=cnt){
                if(r[p-1][i][0]<=r[p-1][i+(1<<(p-1))][0]){
                    r[p][i][0]=r[p-1][i][0];
                    r[p][i][1]=r[p-1][i][1];
                }else{
                    r[p][i][0]=r[p-1][i+(1<<(p-1))][0];
                    r[p][i][1]=r[p-1][i+(1<<(p-1))][1];
                }
            }else{
                r[p][i][0]=r[p-1][i][0];
                r[p][i][1]=r[p-1][i][1];
            }
        }
    }

    for(i=1;i<=m;i++){
        fin>>a>>b;

        a=um[a].first;
        b=um[b].first;
        if(b<a)
            swap(a, b);
        //cout<<a<<" "<<b<<'\n';

        int e=E[b-a+1];
        int ans;
        if(r[e][a][0]<=r[e][b-(1<<e)+1][0]){
            //cout<<r[e][a][0]<<'\n';
            ans=r[e][a][1];
        }else{
            //cout<<r[e][b-(1<<e)+1][0]<<'\n';
            ans=r[e][b-(1<<e)+1][1];
        }

        fout<<lin[ans][0]<<'\n';
    }


    return 0;
}