Cod sursa(job #3227915)

Utilizator gabriel.9619Gabriel Stefan Tita gabriel.9619 Data 3 mai 2024 19:17:41
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#define maxlog 19
#define dim 100001
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

struct rmqitem{
    int nod, niv;
}rmq[maxlog][dim];
vector <int> l[dim];
int tata[dim], pstart[dim], bit[dim];
int n, pcrt;

void calculeaza_putere()
{
    bit[1]=0;
    for(int i=2;i<=n;i++)
    {
        bit[i]=1+bit[i/2];
    }
}

void dfs(int nod, int niv)
{
    pstart[nod]=++pcrt;
    rmq[0][pcrt]={nod, niv};
    for(int i=0;i<l[nod].size();i++)
    {
        dfs(l[nod][i], niv+1);
        rmq[0][++pcrt]={nod, niv};
    }
}

void calculeaza_rmq()
{
    for(int p=1;p<maxlog;p++)
    {
        for(int i=1;i<=pcrt;i++)
        {
            rmq[p][i]=rmq[p-1][i];
            int j=i+(1<<(p-1));
            if(j<=pcrt&&rmq[p-1][j].niv<rmq[p][i].niv)
            {
                rmq[p][i]=rmq[p-1][j];
            }
        }
    }
}

int lca(int x, int y)
{
    int px=pstart[x];
    int py=pstart[y];
    if(px>py)
    {
        swap(px, py);
    }
    int dime=py-px+1;
    int e=bit[dime];
    int len=(1<<e);
    rmqitem st, dr;
    st=rmq[e][px];
    dr=rmq[e][py-len+1];
    if(st.niv<dr.niv)
    {
        return st.nod;
    }
    else
    {
        return dr.nod;
    }
}

int main()
{
    int m, i, x, y;
    fin>>n>>m;
    tata[1]=0;
    for(int i=2;i<=n;i++)
    {
        fin>>tata[i];
        l[tata[i]].push_back(i);
    }
    pcrt=0;
    dfs(1, 0);
    calculeaza_rmq();
    calculeaza_putere();
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        fout<<lca(x, y)<<"\n";
    }
}