Cod sursa(job #1228542)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 14 septembrie 2014 15:43:36
Problema Lowest Common Ancestor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
 int n,m,a[200005],k,pos[100005],log[200005],rmq[200005][18];
 vector <int> v[100005];

 void DFS(int x)
 { int i;
     k++; a[k]=x;

     for(i=0;i<v[x].size();i++)
      { DFS(v[x][i]);
         k++; a[k]=x;
      }
 }

 void RMQ()
 { int i,j;
     for(i=2;i<=k;i++)
      log[i]=log[i/2]+1;

     for(i=1;i<=k;i++)
      rmq[i][0]=a[i];

     for(i=1;i<=log[k];i++)
      for(j=1;j<=k;j++)
       rmq[j][i]=min(rmq[j][i-1],rmq[j+(1<<(i-1))][i-1]);
 }

 int Ans(int x,int y)
 { int len=log[y-x+1];
     return min(rmq[x][len],rmq[y-(1<<len)+1][len]);
 }

int main()
{ int i,j,x,y;
    f>>n>>m;
    for(i=2;i<=n;i++)
    {f>>x; v[x].push_back(i);}

     DFS(1);

   for(i=1;i<=k;i++)
    if (!pos[a[i]]) pos[a[i]]=i;

    RMQ();


    for(;m;m--)
     { f>>x>>y;
        g<<Ans(min(pos[x],pos[y]),max(pos[x],pos[y]))<<"\n"; }

    return 0;
}