Cod sursa(job #2134194)

Utilizator CozmaCatalinCozma Catalin CozmaCatalin Data 17 februarie 2018 18:33:38
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include <bits/stdc++.h>

using namespace std;

const int MAX = 100005;

int Matrix[20][MAX];
int Euler[MAX << 1];
int Level[MAX << 1];
int AP[MAX << 1];
int lg[MAX << 1];
bitset < MAX << 1 > Busy;

int countt;
int N ,M;

vector < int > myVector[MAX];


inline void Read()
{
    scanf("%d%d" , &N , &M);

    for ( int i = 2; i <= N ; ++i)
    {
        int x;
        scanf("%d" , &x);

        myVector[x].push_back(i);
    }
}

void DFS(int nod , int level)
{
    Euler[++countt] = nod;
    Level[countt] = level;
    AP[nod] = countt;

    for ( size_t k = 0 ; k < myVector[nod].size() ; ++k)
    {
        int neighbor = myVector[nod][k];

        DFS(neighbor , level+1);


        Euler[++countt] = nod;
        Level[countt] = level;
    }

}

void RMQ()
{
    lg[1] = 0;

    for ( int i = 2; i <= countt ; ++i)
        lg[i] = lg[i/2]+1;

        for ( int i = 1 ; i <= countt ; ++i)
           {
              Matrix[0][i] = i;
           }

           for ( int i = 1; i <= lg[countt] ; ++i)
            for ( int j = 1; j <= countt - (1<<(i-1)) ; ++j)
               {
                 Matrix[i][j] = Matrix[i-1][j];

                 if(Level[Matrix[i-1][j+(1<<(i-1))]] < Level[Matrix[i-1][j]])
                    Matrix[i][j] = Matrix[i-1][j+(1<<(i-1))];
               }

                 for ( int i = 0; i <= lg[countt] ; ++i)
            {for ( int j = 1 ; j <= countt ; ++j)
            cout << Matrix[i][j] <<" ";
           cout <<endl;}

           for (int i = 1; i <= countt ; ++i)
            cout << Euler[i] <<" ";
           cout << endl;



}

inline int LCA ( int a , int b)
{
    a = AP[a];
    b = AP[b];

 if(a>b) swap(a,b);
int k = lg[b-a+1];

  int solutie = Matrix[k][a];


  if( Level[Matrix[k][b-(1<<k)+1]]< Level[Matrix[k][a]]);
     solutie = Matrix[k][b-(1<<k)+1];

   return Euler[solutie];

}

int main()
{
    freopen("lca.in" , "r" ,stdin);
   freopen("lca.out" ,"w" , stdout);

   Read();

   DFS(1,0);

    RMQ();

    for( int i = 1; i <= M ; ++i)
    {
        int x,y;
        scanf("%d%d" , &x ,&y);

      printf("%d\n" , LCA(x,y));

    }


}