Cod sursa(job #1078164)

Utilizator Iustin_BulimarFMI Iustin Bulimar Iustin_Bulimar Data 12 ianuarie 2014 02:03:34
Problema Lowest Common Ancestor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");

const int n_max=100002;
const int log_n_max=18;

int E[2*n_max+4],Niael[2*n_max+4],nia,Ap[n_max],nre=0,RMQ[log_n_max][n_max];
int LOG[300006];
vector<int>a[100001];

void TEuler(int nod, int nia)
{
    nre++;
    E[nre]=nod;
    Niael[nre]=nia;
    Ap[nod]=nre;
    for(int ji=0;ji<a[nod].size();++ji)
      {
         TEuler(a[nod][ji],nia+1);
         nre++;
         E[nre]=nod;
         Niael[nre]=nia;
      }
}
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(Niael[RMQ[l-1][i+(1<<(l-1))]]<Niael[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(Niael[RMQ[h][q1]]<Niael[RMQ[h][q2-(1<<h)+1]])
         return RMQ[h][q1];
         else
         return RMQ[h][q2-(1<<h)+1];

  }
int main()
{

    int n,m,i,x,y;
    cin>>n>>m;
    for(i=2;i<=n;++i)
      {
          cin>>x;
          a[x].push_back(i);
      }
    TEuler(1,0);
    RMQuu();
    for(i=1;i<=m;i++)
       {
           cin>>x>>y;
           cout<<E[LCA(x,y)]<<'\n';
       }
    return 0;
}