Cod sursa(job #2866020)

Utilizator alexmorosanuMorosanu Alexandru alexmorosanu Data 9 martie 2022 12:13:56
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int rmq[400020][20],a[100005<<1],b[100005<<1],first[100011],nr;
vector <int> v[100011];
void euler(int k,int lvl)
{
    nr++;
    b[nr]=k;
    a[nr]=lvl;
    first[k]=rmq[nr][0]=nr;
    for(int i=0;i<v[k].size();i++)
    {
        euler(v[k][i],lvl+1);
        nr++;
        a[nr]=lvl;
        b[nr]=k;
        rmq[nr][0]=nr;
    }
}
int lg[100005<<1];
void buildrmq()
{
    lg[1]=lg[0]=0;
    for(int i=2;i<=nr;i++)
        lg[i]=lg[i/2]+1;
    for(int i=1;1<<i<=nr;i++)
        for(int j=1;j<=nr-(1<<i)+1;j++)
        if(a[rmq[j][i-1]]<a[rmq[j+(1<<(i-1))][i-1]])
            rmq[j][i]=rmq[j][i-1];
        else
            rmq[j][i]=rmq[j+(1<<(i-1))][i-1];
}
int n,m,i,x,y,l;
int main()
{
    f>>n>>m;
    for(i=2;i<=n;i++)
    {
        f>>x;
        v[x].push_back(i);
    }
    euler(1,0);
    buildrmq();
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        x=first[x];
        y=first[y];
        if(x>y)
            swap(x,y);
        l=lg[y-x+1];
        if(a[rmq[x][l]]<a[rmq[y-(1<<l)+1][l]])
            g<<b[rmq[x][l]]<<'\n';
        else
            g<<b[rmq[y-(1<<l)+1][l]]<<'\n';
    }
    return 0;
}