Cod sursa(job #2924687)

Utilizator RaresPoinaruPoinaru-Rares-Aurel RaresPoinaru Data 8 octombrie 2022 14:52:17
Problema Lowest Common Ancestor Scor 0
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=100000;
const int LOGN=20;

int timpin[MAXN],timpout[MAXN],timp,n,m,tati[MAXN],l,visit[MAXN];
vector <int> g[MAXN];
pair <int,int> e[MAXN],rmq[LOGN][MAXN];;

void dfs (int nod, int nivel){
    if (visit[MAXN]>0)
        return;
    e[++l]={nod,nivel};
    visit[nod]=l;
    int ok=0;
    for (int i=0;i<g[nod].size ();++i){
        if (visit[g[nod][i]]==0){
            dfs (g[nod][i],nivel+1);
            e[++l]={nod,nivel};
        }
    }
}

int main(){
    fin >>n>>m;
    for (int i=1;i<=n-1;++i){
        int x;
        fin >>x;
        tati[i+1]=x;
        g[x].push_back (i+1);
    }
    dfs (1,0);

    /*for (int i=1;i<=l;++i)
        fout <<e[i].first<<' '<<e[i].second<<'\n';
    for (int i=1;i<=n;++i)
        fout <<visit[i]<<' ';*/

    for (int i=1;i<=l;++i)
        rmq[0][i]=e[i];
    for (int i=1;i<19;++i){
        for (int j=1;j+(1<<i)-1<=l;++j){
            if (rmq[i-1][j].second<rmq[i-1][j+(1<<(i-1))].second)
                rmq[i][j]=rmq[i-1][j];
            else
                rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
        }
    }
    for (int i=1;i<=m;++i){
        int x,y,a,b,l,kl,p=0;
        fin >>x>>y;
        a=visit[x];
        b=visit[y];
        if (a>b)
            swap (a,b);
        kl=l=b-a+1;
        while (kl>1){
            kl/=2;
            p++;
        }

        if (rmq[p][a].second>rmq[p][b-(1<<p)+1].second)
            fout <<rmq[p][b-(1<<p)+1].first<<'\n';
        else
            fout <<rmq[p][a].first<<'\n';
    }
    fin.close ();
    fout.close ();
    return 0;
}