Cod sursa(job #756079)

Utilizator XladhenianGrigorita Vlad-Stefan Xladhenian Data 8 iunie 2012 23:03:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
                                                     
#include <fstream>
using namespace std;

long N;
long A[131072];
long Data[20][131072];
long lg[131072];

long minint(long a,long b)
{
 if (a < b)
   {
    return a;
   }
 return b;
}

void Build(void)
{
 long l,i;
 lg[1] = 0;
 for (i = 2;i < N;i += 1)
  {
   lg[i] = lg[i >> 1] + 1;
  }
 for (i = 0;i < N;i += 1)
  {
   Data[0][i] = A[i];
  }
 for (l = 1;(1 << l) <= N;l += 1)
  {
   for (i = 0;i < N - (1 << (l - 1));i += 1)
    {
     Data[l][i] = minint(Data[l - 1][i],Data[l - 1][i + (1 << (l - 1))]);
    }
  }
}

long Compute(long x,long y)
{
 long l = lg[y - x];
 return minint(Data[l][x],Data[l][y - (1 << l) + 1]);
}

int main(void)
{
 long M,i,x,y;
 fstream fin("rmq.in",ios::in);
 fstream fout("rmq.out",ios::out);
 fin >> N >> M;
 for (i = 0;i < N;i += 1)
  {
   fin >> A[i];
  }
 Build();
 for (i = 0;i < M;i += 1)
  {
   fin >> x >> y;
   fout << Compute(x - 1,y - 1) << "\n";
  }
 fin.close();
 fout.close();
 return 0;
}