Cod sursa(job #2950629)

Utilizator TraianQTraianQ TraianQ Data 4 decembrie 2022 13:08:45
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>
using namespace std;
int A[18][100005],level[100005];
vector <int> V[100005];
int sir[200005],cnt=0;
void DFS(int k,int ant)
{
    cnt++;
    sir[cnt]=k;
    for(auto x:V[k])
    {
        level[x]=level[k]+1;
        DFS(x,k);
    }
    if(k!=ant)
        cnt++,sir[cnt]=ant;
}
int rmq[18][200005],lg[200005],poz[100005];
int main()
{
    ifstream fin("lca.in");
    ofstream fout("lca.out");
    ios_base::sync_with_stdio(false);
    fin.tie(0);
    fout.tie(0);
    int n,Q,a,b;
    fin>>n>>Q;
    for(int i=2;i<=n;i++)
    {
        fin>>A[0][i];
        V[A[0][i]].push_back(i);
    }
    for(int i=2;i<=200000;i++)
        lg[i]=lg[i/2]+1;
    level[1]=1;
    DFS(1,1);
    rmq[0][0]=1;
    for(int i=1;i<=cnt;i++)
    {
        if(poz[sir[i]]==0)
            poz[sir[i]]=i;
        rmq[0][i]=sir[i];
    }
    for(int i=1;i<=18;i++)
        for(int j=1;j<=cnt-(1<<i)+1;j++)
        {
            if(level[rmq[i-1][j]]<level[rmq[i-1][j+(1<<(i-1))]])
                rmq[i][j]=rmq[i-1][j];
            else
                rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
        }
    for(int q=1;q<=Q;q++)
    {
        fin>>a>>b;
        a=poz[a];
        b=poz[b];
        if(a>b)
            swap(a,b);
        int dif=b-a+1,val=lg[dif],idk=dif-(1<<val);
        if(level[rmq[lg[dif]][a]]<level[rmq[lg[dif]][a+idk]])
            fout<<rmq[lg[dif]][a]<<'\n';
        else
            fout<<rmq[lg[dif]][a+idk]<<'\n';
    }
    return 0;
}