Cod sursa(job #2769199)

Utilizator stefanvoicaVoica Stefan stefanvoica Data 14 august 2021 08:41:08
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>
#define dim 100005
#define mod 1000000007
#define int long long
#define INF  2000000000
using namespace std;
ifstream fin ("lca.in");
ofstream fout("lca.out");
int n,poz[dim],k,put[21],apr[2*dim];
vector<int>a[dim];

struct el
{
    int nod,niv;
} rmq[20][2*dim];

void dfs (el x)
{
    rmq[0][++k]=x;
    if (poz[x.nod]==0)
        poz[x.nod]=k;
    for (auto y:a[x.nod])
    {
        dfs({y,x.niv+1});
        rmq[0][++k]=x;
    }
}

el mini(el x,el y)
{
    if (x.niv==y.niv)
    {
        if (x.nod<y.nod)
            return x;
        return y;
    }
    else    if (x.niv<y.niv)
        return x;
    else    return y;
}

void Solve ()
{
    int i,j,nr=1,y=0;
    put[0]=1;
     for (i=1;i<=k;i++)
      {
        if (nr*2==i)
        {
            nr*=2,++y;
            put[y]=nr;
        }
        apr[i]=y;
    }
    for (i=1;i<=17;i++)
        for (j=1;j<=k-put[i]+1;j++)
        rmq[i][j]=mini(rmq[i-1][j],rmq[i-1][j+put[i-1]]);
}

int rez(int x,int y)
{
    int lg=y-x+1;
    el z=mini(rmq[apr[lg]][x],rmq[apr[lg]][y-put[apr[lg]]+1]);
    return z.nod;
}

int32_t main()
{
    int i,t,x,y;
    fin>>n>>t;
    for (i=2; i<=n; i++)
    {
        fin>>x;
        a[x].push_back(i);
    }
    dfs({1,0});
    Solve ();
    while (t--)
    {
        fin>>x>>y;
        x=poz[x],y=poz[y];
        if (y<x)
            swap(x,y);
        fout<<rez(x,y)<<'\n';
    }
}