Cod sursa(job #3174748)

Utilizator NathanBBerintan Emanuel Natanael NathanB Data 25 noiembrie 2023 09:43:10
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <bits/stdc++.h>

using namespace std;
//ofstream fout("fisier.out");
typedef long long ll;
#define Inf 0x3f3f3f3f
//#define cout fout
const int Lim = 1e6,Nmax=1e5+1,LOG=18;
char s[Lim];
int p = Lim-1;

void next()
{
    if(++p == Lim)
    fread(s,1,Lim,stdin), p=0;
}

void Get(int &x)
{
    while(!isdigit(s[p])) next();
    for(x=0;isdigit(s[p]);next())
        x = x*10 + s[p] - '0';
}

int t[Nmax];
vector<int> G[Nmax];
int n,m;

int v[2*Nmax],lev[Nmax],rmq[LOG][2*Nmax],poz[Nmax];
int cnt = 0;

void Dfs(int nod,int niv)
{
    v[++cnt] = nod;
    lev[cnt] = niv;
    if(poz[nod]==0)poz[nod] = cnt;
    for(auto c:G[nod])
    {
        Dfs(c,niv+1);
        v[++cnt] = nod;
        lev[cnt] = niv;
    }
}

int main()
{
    freopen("fisier.in","r",stdin);
    freopen("fisier.out","w",stdout);
    Get(n);
    Get(m);
    //printf("%d %d\n",n,m);
    for(int i=2;i<=n;i++)
    {
        int c;
        Get(c);
        G[c].emplace_back(i);
    }
    Dfs(1,1);
    for(int i=1;i<=cnt;i++)
        rmq[0][i] = i;
    for(int k=1;k<LOG;k++)
        for(int i=1;i+(1<<k)<=cnt;i++)
    {
        int p1 = rmq[k-1][i], p2=rmq[k-1][i+(1<<(k-1))];
        if(lev[p1] < lev[p2])
            rmq[k][i] = p1;
        else
            rmq[k][i] = p2;
    }
    /*for(int i=1;i<=cnt;i++)
        printf("%d ",v[i]);
    printf("\n");
    for(int i=1;i<=cnt;i++)
        printf("%d ",lev[i]);
    printf("\n");*/
    for(int i=1;i<=m;i++)
    {
        int st,dr;
        Get(st);
        Get(dr);
        st = poz[st];
        dr = poz[dr];
        if(st>dr) swap(st,dr);
        int l=0;
        while((1<<(l+1)) <= dr-st+1) l++;
        int p1 = rmq[l][st], p2 = rmq[l][dr-(1<<l)+1];
        //printf("st dr p1 p2 = %d %d %d %d\n",st,dr,p1,p2);
        int ans;
        if(lev[p1] < lev[p2])
            ans = v[p1];
        else ans = v[p2];
        printf("%d\n",ans);
    }
    return 0;
}