Cod sursa(job #3030167)

Utilizator Theo14Ancuta Theodor Theo14 Data 17 martie 2023 15:43:49
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");

int n,m,niv[100005],k,e[100005],p[100005],poz[100005];
vector<int>v[100005];
struct elem
{
    int x,y;
}sol[200005],rmq[22][200005];

void dfs(int nod, int tata)
{
    k++;
    sol[k].x=nod;
    sol[k].y=niv[nod];
    for(auto it:v[nod])
    {
        if(it!=tata)
        {
            niv[it]=niv[nod]+1;
            dfs(it,nod);
            k++;
            sol[k].x=nod;
            sol[k].y=niv[nod];
        }
    }
}

signed main()
{
    int i,x,c,y;
    f>>n>>m;
    for(i=2;i<=n;i++)
        f>>x,v[i].push_back(x),v[x].push_back(i);
    dfs(1,0);
    for(i=1;i<=k;i++)
    {
        if(poz[sol[i].x]==0)
            poz[sol[i].x]=i;
    }
    x=1;
    c=0;
    for(i=1;i<=k;i++)
    {
        if(2*x==i)
            x*=2,c++;
        e[i]=c;
        p[c]=x;
    }
    for(i=1;i<=k;i++)
        rmq[0][i]=sol[i];
    x=2;
    c=1;
    while(x<=k)
    {
        for(i=1;i<=k-x+1;i++)
        {
            if(rmq[c-1][i].y<rmq[c-1][i+x/2].y)
                rmq[c][i]=rmq[c-1][i];
            else
                rmq[c][i]=rmq[c-1][i+x/2];
        }
        x*=2;
        c++;
    }
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        x=poz[x];
        y=poz[y];
        int dist=y-x+1;
        int nr=e[dist];
        int nr1=p[nr];
        if(rmq[nr][x].y<rmq[nr][y-nr1+1].y)
            g<<rmq[nr][x].x;
        else
            g<<rmq[nr][y-nr1+1].x;
        g<<'\n';
    }
    return 0;
}