Cod sursa(job #3183157)

Utilizator stefiiBarila Stefana stefii Data 10 decembrie 2023 20:01:44
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MAXN=1e5+5;

vector <int> G[MAXN];

int r[20*MAXN], tata[MAXN], rmq[50][20*MAXN], v[MAXN], k, n, m, t=1, grad[MAXN], e[20*MAXN], x, a, b, nod[50][20*MAXN];

void dfs (int i){
    v[i]=t;
    r[t]=grad[i];
    nod[0][t]=i;
    t++;

    for (int u=0;u<G[i].size();++u){
        if (v[G[i][u]]==0){
            grad[G[i][u]]=grad[i]+1;
            dfs(G[i][u]);
            r[t]=grad[i];
            nod[0][t]=i;
            t++;
        }
    }
}

void precalc(){
    for (int i=1;i<t;++i){
        rmq[0][i]=r[i];
    }
    for (int i=1;(1<<i)<t;++i){
        for (int j=1;j+(1<<i)-1<t;++j){
            if (rmq[i-1][j]<rmq[i-1][j+(1<<(i-1))]){
                rmq[i][j]=rmq[i-1][j];
                nod[i][j]=nod[i-1][j];
            }
            else{
                rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
                nod[i][j]=nod[i-1][j+(1<<(i-1))];
            }
        }
    }
}

int main()
{
    fin>>n>>m;
    for (int i=1;i<n;++i){
        fin>>tata[i+1];
        G[tata[i+1]].push_back(i+1);
    }
    grad[1]=1;
    dfs(1);
    precalc();
    for (int i=1;i<t;++i){
        e[i]=e[i/2]+1;
    }
    for (int i=1;i<=m;++i){
        fin>>a>>b;
        a=v[a];
        b=v[b];
        if (a>b)
            swap(a, b);
        k=e[b-a+1]-1;
        x=min(rmq[k][a], rmq[k][b-(1<<k)+1]);
        if (rmq[k][a]<rmq[k][b-(1<<k)+1]){
            fout<<nod[k][a]<<'\n';
        }
        else{
            fout<<nod[k][b-(1<<k)+1]<<'\n';
        }
        //cout<<abs(x-r[a])+abs(x-r[b])<<'\n';
    }
    return 0;
}