Cod sursa(job #2973086)

Utilizator MihaiCostacheCostache Mihai MihaiCostache Data 30 ianuarie 2023 22:15:22
Problema Lowest Common Ancestor Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
struct elementrmq
{
    int nod;
    int niv;
};
int nr, poz[100002], e[200002];
elementrmq rmq[10][200002];
int n, q, t, x, y;
vector <int> l[100002];

void dfs(int nod, int niv)
{
    rmq[0][++nr]={nod, niv};
    poz[nod]=nr;
    for(int i=0; i<l[nod].size(); i++)
    {
        int fiu=l[nod][i];
        dfs(fiu, niv+1);
        rmq[0][++nr]={nod, niv};
    }
}

void calcul_rmq()
{
    for(int p=1; (1<<p)<=nr; p++)
    {
        for(int i=1; i<=nr; i++)
        {
            rmq[p][i]=rmq[p-1][i];
            int j=i+ (1 << (p-1));
            if(j<=nr && rmq[p-1][j].niv<rmq[p][i].niv)
            {
                rmq[p][i]=rmq[p-1][j];
            }
        }
    }
    e[1]=0;
    for(int i=2; i<=nr; i++)
    {
        e[i]=e[i/2]+1;
    }
}

int lca(int x, int y)
{
    int p1=poz[x];
    int p2=poz[y];
    if(p1>p2)
        swap(p1, p2);
    int k=e[p2-p1+1];
    int l=(1<<k);
    if(rmq[k][p1].niv < rmq[k][p2-l+1].niv)
        return rmq[k][p1].nod;
    return rmq[k][p2-l+1].nod;
}

int main()
{
    fin>>n>>q;
    for(int i=2; i<=n; i++)
    {
        fin>>t;
        l[t].push_back(i);
    }
    dfs(1, 0);
    calcul_rmq();
    for(int i=1; i<=q; i++)
    {
        fin>>x>>y;
        fout<<lca(x, y)<<"\n";
    }
    return 0;
}