Cod sursa(job #2230154)

Utilizator tiberiu392Tiberiu Ungurianu tiberiu392 Data 9 august 2018 11:48:33
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int nmax = 100005;
int eul[2*nmax], ne, n, m, tt, x, y, i, j, first[nmax];
int rmq[18][2*nmax], niv[nmax], log2[2*nmax];
vector <int> ls[nmax];

void dfs( int x )
{
    int l = ls[x].size(), i, y;
    eul[ne++] = x;
    first[x] = ne;
    for ( i = 0 ; i < l ; i++ )
    {
        y = ls[x][i];
        niv[y] = niv[x]+1;
        dfs(y);
        eul[ne++] = x;

    }
}


void range_minimum()
{

    int i, j, x, y;
    for ( i = 2 ; i <= ne ; i++ )
        log2[i] = log2[i/2]+1;
    for ( i = 1 ; i <= ne ; i++ )
        rmq[0][i] = eul[i];

    for (i=1; (1<<i )<= ne; i++)
        for (  j =1 ;  j+(1<<i)+1 <= ne ; j++)
        {
            x = rmq[i-1][j];
        y = rmq[i-1][j+(1<<(i-1))];
        if(niv[x] < niv[y])
            rmq[i][j] = x;
        else
            rmq[i][j] = y;

        }
}

int query(int x, int y)
{
    int a = first[x], b = first[y];
    if( a > b )
        swap(a, b);
int     diff = b-a+1;
    int i = log2[diff];
    int aa = rmq[i][a];
    int bb = rmq[i][b-(1<<i)+1];
    if( niv[aa] < niv[bb])
        return aa;
    else
        return bb;
}
int main()
{
   f >> n >> m;
   for ( int  i = 2 ;  i <= n  ; i++  )
   {
     f >> tt;
     ls[tt].push_back(i);
   }

   dfs(1);
   range_minimum();

   while ( m-- )
   {
       f >> x >> y ;
       g << query( x , y ) << "\n";
   }

    return 0;
}