Cod sursa(job #3207558)

Utilizator AndreasBossGamerBaragau Andreas AndreasBossGamer Data 26 februarie 2024 13:49:26
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <vector>

using namespace std;

int n ,q;
vector<vector<int> > adj;

int euler[200002];
int height[100001];
int low[100001];
bool vizitat[100001];
int rmq[19][200002];
int puteri[19];

void preCalc2()
{
    puteri[0] = 1;
    for(int i = 1; i<=18;i++)
        puteri[i] = 2 * puteri[i-1];
}

void eulerTree(int node ,int& index)
{
    vizitat[node] = true;
    euler[index++] = node;
    for(auto e : adj[node])
    {
        if(!vizitat[e])
        {
            low[e] = index - 1;
            height[e] = height[node] + 1;
            eulerTree(e, index);
            euler[index++] = node;
        }
    }
}

int main()
{
    cin>>n >> q;
    adj.resize(n+1);
    for(int i = 2;i<=n;i++)
    {
        int x;
        cin>>x;
        adj[x].push_back(i);
    }
    int index = 1;
    preCalc2();
    eulerTree(1, index);
    index--;
    for(int i = 1;i <= index; i++) rmq[0][i] = euler[i];
    for(int e = 1; e<=18;e++)
    {
        for(int i = 1; i<=index;i++)
        {
            int j = puteri[e-1] + i;
            rmq[e][i] = rmq[e-1][i];
            if(j<=index && rmq[e-1][i] > rmq[e-1][j])
                rmq[e][i] = rmq[e-1][j];
        }
    }

    for(int e = 0; e<=18;e++)
    {
        for(int i = 1; i<=index;i++)
        {
            cout<<rmq[e][i]<<" ";
        }
        cout<<'\n';
    }
    /*for(int i = 1;i<=index;i++) cout<<euler[i]<<" ";
    cout<<'\n';
    for(int i = 1;i<=n;i++) cout<<low[i]<<" ";-*/

}