Cod sursa(job #1050209)

Utilizator Dayanna000Amegica Dayanna Dayanna000 Data 8 decembrie 2013 13:06:05
Problema Lowest Common Ancestor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 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][100001];
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]=E[i];
    for(l=1;(1<<l)<=nre;++l)
       for(i=1;i<=nre;++i)
          {
              if(i+(1<<l)<=nre+1)
              {
                  RMQ[l][i]=RMQ[l-1][i];
                  if(RMQ[l-1][i+(1<<(l-1))]<RMQ[l][i])
                      RMQ[l][i]=RMQ[l-1][i+(1<<(l-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=(int)log2(q2-q1+1);
      if(RMQ[h][q1]<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<<LCA(x,y)<<'\n';
       }
    f.close();
    g.close();
    return 0;
}