Cod sursa(job #3005045)

Utilizator gabriel.9619Gabriel Stefan Tita gabriel.9619 Data 16 martie 2023 19:03:18
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#include <vector>
#define maxl 19
#define dim 100001
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

struct rmqi{
    int nod, niv;
}rmq[maxl][dim];
int crt=0;
int ps[dim], bit[dim], tata[dim];
vector <int> l[dim];

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

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

void calcrmq()
{
    for(int p=1;p<maxl;p++)
    {
        for(int i=1;i<=crt;i++)
        {
            rmqi st, dr;
            st=rmq[p-1][i];
            if(i+(1<<(p-1))<=crt)
            {
                dr=rmq[p-1][i+(1<<(p-1))];
                if(st.niv<dr.niv)
                {
                    rmq[p][i]=st;
                }
                else
                {
                    rmq[p][i]=dr;
                }
            }
            else
            {
                rmq[p][i]=st;
            }
        }
    }
}

int lca(int x, int y)
{
    int px=ps[x];
    int py=ps[y];
    if(px>py)
    {
        swap(px, py);
    }
    int p=bit[py-px+1];
    rmqi st, dr;
    st=rmq[p][px];
    dr=rmq[p][py-(1<<p)+1];
    if(st.niv<dr.niv)
    {
        return st.nod;
    }
    else
    {
        return dr.nod;
    }
}

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