Cod sursa(job #2720039)

Utilizator TudorChirila11Tudor Chirila TudorChirila11 Data 10 martie 2021 15:44:04
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
#define N 100001
#define pb push_back
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> v[N], eul;
int n, q, i, x, rmq[18][2*N], pmin[18][2*N], lvl[N], lg[2*N], p[N], y;
void euler(int nod)
{
    eul.pb(nod);
    for(auto i:v[nod])
    {
        int ok=1;
        lvl[i]=lvl[nod]+1;
        euler(i);
        eul.pb(nod);
    }
}
void do_rmq()
{
    int i, j;
    for(i=2;i<=n;++i)
        lg[i]=lg[i/2]+1;
    for(i=1;i<=lg[n];++i)
        for(j=0;j<n-(1<<i)+1;++j)
        {
            if(rmq[i-1][j]<rmq[i-1][j+(1<<(i-1))])
            {
                rmq[i][j]=rmq[i-1][j];
                pmin[i][j]=pmin[i-1][j];
            }
            else
            {
                rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
                pmin[i][j]=pmin[i-1][j+(1<<(i-1))];
            }
           // rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
        }
}
int main()
{
    fin>>n>>q;
    for(i=2;i<=n;++i)
    {
        fin>>x;
        v[x].pb(i);
    }
    euler(1);
    for(i=0;i<eul.size();++i)
    {
        if(p[eul[i]]==0)
            p[eul[i]]=i;
        rmq[0][i]=lvl[eul[i]];
        pmin[0][i]=eul[i];
    }
    n=eul.size();
    do_rmq();
    while(q--)
    {
        fin>>x>>y;
        int l=p[x], r=p[y];
        if(l>r)
            swap(l,r);
        int lgg=lg[r-l];
        if(rmq[lgg][l]<rmq[lgg][r-(1<<(lgg))+1])
           fout<<pmin[lgg][l]<<'\n';
        else fout<<pmin[lgg][r-(1<<(lgg))+1]<<'\n';

    }
    return 0;
}