Cod sursa(job #1127128)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 27 februarie 2014 11:16:52
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <bitset>
#define Nmax 100099
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");

int N,Q,x,y,E[2*Nmax],L[Nmax],F[Nmax],lg[2*Nmax],RMQ[20][2*Nmax];
vector < int > G[Nmax];
bitset < Nmax > viz;

void ReadInput()
{
     f>>N>>Q;
     for(int i=2;i<=N;++i)
          f>>x , G[x].push_back(i);
}

void DFS(int node,int level)
{
     viz[node]=1;
     E[++E[0]]=node;
     L[node]=level;
     F[node]=E[0];
     for(vector<int>::iterator it=G[node].begin();it!=G[node].end();++it)
          if(!viz[*it])
          {
               DFS(*it,level+1);
               E[++E[0]]=node;
          }
}

void MakeRMQ()
{
     for(int j=2;j<=E[0];++j)lg[j]=lg[j/2]+1;
     for(int j=1;j<=E[0];++j)RMQ[0][j]=E[j];
     for(int i=1;(1<<i)<=E[0];++i)
          for(int j=1;j<=E[0]-(1<<i)+1;++j)
          {
               int x=RMQ[i-1][j],y=RMQ[i-1][j+(1<<(i-1))];
               if(L[x]<L[y])RMQ[i][j]=x;
                    else    RMQ[i][j]=y;
          }
}

int LCA(int x,int y)
{
     int st=F[x],dr=F[y];
     if(st>dr)swap(st,dr);
     int log=lg[dr-st+1];
     x=RMQ[log][st],y=RMQ[log][dr-(1<<log)+1];
     if(L[x]<L[y])return x;
          else    return y;
}

int main()
{
     ReadInput();
     DFS(1,1);
     MakeRMQ();
     for(int i=1;i<=Q;++i)
          f>>x>>y , g<<LCA(x,y)<<'\n';
     f.close();g.close();
     return 0;
}