Cod sursa(job #2467120)

Utilizator vmnechitaNechita Vlad-Mihai vmnechita Data 3 octombrie 2019 18:58:19
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.49 kb
#include <fstream>
#include <vector>
#include <math.h>

using namespace std;

ifstream fin ("lca.in");
ofstream fout ("lca.out");

void dfs ( int nod );

struct A
{
    int val, poz;
};

vector < int > fii[100001];
vector < A > rmq[18];
int n, m, j, k, x, Lg, b, c;
int t, a[200001], lvl[100001], prim[100001];

//void afisare();

int main()
{
    int i;

    fin >> n >> m;
    for ( i = 2 ; i <= n ; i++ )
    {
        fin >> t;
        fii[t].push_back ( i );
    }

    dfs ( 1 );

    Lg = j;
    x = log2 ( Lg );
    for ( i = 1 ; i <= Lg ; i++ ) rmq[0].push_back ( { lvl[i], a[i] } );
    for ( i = 1 ; i <= x ; i++ )
        for ( j = 0 ; j < Lg - ( 1 << i ) + 1 ; j++ )
            {
                if ( rmq[i-1][j].val <= rmq[i-1][j+(1<<(i-1))].val ) rmq[i].push_back ( { rmq[i-1][j].val, rmq[i-1][j].poz } );
                else rmq[i].push_back ( { rmq[i-1][j+(1<<(i-1))].val, rmq[i-1][j+(1<<(i-1))].poz } );
            }

    //afisare();

    for ( i = 1 ; i <= m ; i++ )
    {
        fin >> b >> c;
        if ( b == c ) fout << b << '\n';
        else
        {
            if ( prim[b] > prim[c] ) swap ( b, c );
            x = log2 ( prim[c] - prim[b] + 1 );
            if ( rmq[x][prim[b]-1].val <= rmq[x][prim[c]-(1<<x)].val ) fout << rmq[x][prim[b]-1].poz << '\n';
            else fout << rmq[x][prim[c]- ( 1 << x )].poz << '\n';
        }
    }

    return 0;
}

void dfs ( int nod )
{
    int i;

    for ( i = 0 ; i < fii[nod].size() ; i++ )
    {
        a[++j] = nod;
        lvl[j] = k;
        if ( prim[nod] == 0 ) prim[nod] = j;

        k++;
        dfs ( fii[nod][i] );
        k--;
    }

    a[++j] = nod;
    lvl[j] = k;
    if ( prim[nod] == 0 ) prim[nod] = j;
}

/*void afisare()
{
    int i;

    fout << " a  : ";
    for ( i = 1 ; i <= Lg ; i++ ) fout << a[i] << "  ";
    fout << '\n';
    fout << "lvl : ";
    for ( i = 1 ; i <= Lg ; i++ ) fout << lvl[i] << "  ";
    fout << '\n' << '\n';
    fout << "prim: ";
    for ( i = 1 ; i <= n ; i++ ) fout << prim[i] << "  ";
    fout << '\n' << '\n';
    fout << "Matricea pentru rmq : " << '\n';
    for ( i = 0 ; i <= x; i++ )
    {
        for ( j = 0 ; j < rmq[i].size() ; j++ ) fout << rmq[i][j].val << ' ';
        fout << '\n';
    }

    fout << '\n' << '\n';

    for ( i = 0 ; i <= x; i++ )
    {
        for ( j = 0 ; j < rmq[i].size() ; j++ ) fout << rmq[i][j].poz << ' ';
        fout << '\n';
    }

    fout << '\n' << '\n';
}*/