Cod sursa(job #2471477)

Utilizator XsoundCristian-Ioan Roman Xsound Data 10 octombrie 2019 23:43:14
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <bits/stdc++.h>
#define Nmax 100005
#define Dmax 17
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");

vector < int > v [Nmax];

int P[Nmax][Dmax];
int T[Nmax], H[Nmax];

int n,q,lvl, i1,i2;

void citesc ();
void preprocess ();
void DFS ( int x );
int solve ();

int main()
{
    lvl = -1;
    citesc();
}

int solve ()
{
    if ( H[i1] < H[i2] )
        swap (i1,i2);

    int k;

    for ( k = 0; (1<<k) <= H[i1] ; k++ );
    k--;

    for ( int j = k; j >= 0; j-- )
        if ( H[i1] - ( 1<<j ) >= H[i2] )
            i1= P[i1][j];

    if ( i1 == i2 )
        return i1;

    for ( int j = k; j >=0; j-- )
        if ( P[i1][j] != -1 && P[i1][j] != P[i2][j] )
        {
            i1 = P[i1][j];
            i2 = P[i2][j];
        }

    return T[i1];
}
void citesc ()
{
    int x;

    fin >> n >> q;

    for ( int i = 2; i <= n; i++)
    {
        fin >> x;

        v[x].push_back(i);

        T[i] = x;
    }

    preprocess();

    DFS ( 1 );

    for ( int i = 1 ; i <= q; i++ )
    {
        fin >> i1 >> i2;

        fout << solve() << '\n';
    }

    fin.close();
}

void DFS ( int x )
{
    lvl ++;

    H[x] = lvl;

    for ( int i = 0 ; i < v[x].size(); i++ )
        DFS( v[x][i] );

    lvl -- ;
}

void preprocess()
{
    int x ;

    for ( int j = 0; (1<<j) <= n; j++ )
        for ( int i = 0; i <= n; i++ )
            P[i][j] = -1;

    for ( int i = 2; i <= n; i++ )
        P[i][0] = T[i];

    for ( int j = 1 ; (1<<j) <=n; j++ )
        for ( int i = 1; i <= n; i++)
        {
            x = P[i][j-1];

            if ( x != -1 )
                P[i][j] = P [x][j-1];
        }

    return ;
}