Mai intai trebuie sa te autentifici.

Cod sursa(job #2974005)

Utilizator gabriel.9619Gabriel Stefan Tita gabriel.9619 Data 2 februarie 2023 21:40:03
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>
#include <vector>
#define MAX_LOG 19
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

struct rmqi{
    int nod, niv;
};

int nr=0, n;
int v[200001], max_bit[200001], tata[200001];
rmqi rmq[MAX_LOG][200001];
vector <int> l[100001];

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

void buildrmq()
{
    for(int p=1;p<MAX_LOG;p++)
    {
        for(int i=1;i<=nr;i++)
        {
            rmqi st, dr;
            st=rmq[p-1][i];
            if(i+(1<<(p-1))<=nr)
            {
                dr=rmq[p-1][i+(1<<(p-1))];
                if(st.niv>dr.niv)
                {
                    rmq[p][i]=dr;
                }
                else
                {
                    rmq[p][i]=st;
                }
            }
            else
            {
                rmq[p][i]=st;
            }
        }
    }
}

void calc_max_bit()
{
    max_bit[1]=0;
    for(int i=2;i<=nr;i++)
    {
        max_bit[i]=max_bit[i/2]+1;
    }
}

int lca(int x, int y)
{
    int posx, posy;
    posx=v[x];
    posy=v[y];
    if(posx>posy)
    {
        swap(posx, posy);
    }
    int p=max_bit[posy-posx+1];
    rmqi st, dr;
    st=rmq[p][posx];
    dr=rmq[p][posy-(1<<p)+1];
    if(st.niv<dr.niv)
    {
        return st.nod;
    }
    else
    {
        return dr.nod;
    }
}

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