Cod sursa(job #2951333)

Utilizator AndreibatmanAndrei Croitoriu Andreibatman Data 6 decembrie 2022 00:05:44
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.8 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int>v[100010];
int rmq[200010][20],i,j,n,q,a,b,first[100010],lg,x,k;
void euler(int nod)
{
    rmq[++lg][0]=nod;
    if(first[nod]==0)
        first[nod]=lg;
    for(auto it:v[nod])
    {
        euler(it);
        rmq[++lg][0]=nod;
    }
}
int main()
{
    fin>>n>>q;
    for(i=2;i<=n;i++)
    {
        fin>>x;
        v[x].push_back(i);
    }
    euler(1);
    for(j=1;(1<<j)<=lg;j++)
        for(i=1;i+(1<<j)-1<=lg;i++)
            rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
    while(q--)
    {
        fin>>a>>b;
        a=first[a];
        b=first[b];
        k=floor(log2(b-a+1));
        fout<<min(rmq[a][k],rmq[b-(1<<k)+1][k])<<'\n';
    }
    return 0;
}