Cod sursa(job #1078144)

Utilizator Iustin_BulimarFMI Iustin Bulimar Iustin_Bulimar Data 12 ianuarie 2014 01:36:39
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
vector<int>v[100001];
int E[1000000],Nivel[1000000],niv,Ap[1000000],nre=0,RMQ[21][300006];
int LOG[300006];
void TEuler(int nod, int niv)
{
    nre++;
    E[nre]=nod;
    Nivel[nre]=niv;
    Ap[nod]=nre;
    for(int ji=0;ji<v[nod].size();++ji)
      {
         TEuler(v[nod][ji],niv+1);
         nre++;
         E[nre]=nod;
         Nivel[nre]=niv;
      }
}
void RMQuu()
  {
    int i,l;
    for(i=1;i<=nre;++i)
      RMQ[0][i]=i;
    for(l=1;(1<<l)<=nre;++l)
       for(i=1;i<=nre;++i)
          {
              if(i+(1<<l)<=nre+1)
              {
                  if(Nivel[RMQ[l-1][i+(1<<(l-1))]]<Nivel[RMQ[l-1][i]])
                      RMQ[l][i]=RMQ[l-1][i+(1<<(l-1))];
                      else
                      RMQ[l][i]=RMQ[l-1][i];
              }
          }
    LOG[1]=1;
    for(int i=2;i<=nre;i++)
        LOG[i]=LOG[i/2]+1;
  }
int LCA(int x,int y)
  {
      int h,q1,q2,aux;
      q1=Ap[x];
      q2=Ap[y];
      if(q1>q2)
        {
            aux=q1;
            q1=q2;
            q2=aux;
        }
      h=log2 (q2-q1+1);
      if(Nivel[RMQ[h][q1]]<Nivel[RMQ[h][q2-(1<<h)+1]])
         return RMQ[h][q1];
         else
         return RMQ[h][q2-(1<<h)+1];

  }
int main()
{
    ifstream f("lca.in");
    ofstream g("lca.out");
    int n,m,i,x,y;
    f>>n>>m;
    for(i=2;i<=n;++i)
      {
          f>>x;
          v[x].push_back(i);
      }
    TEuler(1,0);
    RMQuu();
    for(i=1;i<=m;i++)
       {
           f>>x>>y;
           g<<E[LCA(x,y)]<<'\n';
       }
    f.close();
    g.close();
    return 0;
}