Cod sursa(job #1914034)

Utilizator M.AndreiMuntea Andrei Marius M.Andrei Data 8 martie 2017 15:12:58
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#include <algorithm>
using namespace std;


ifstream f{ "rmq.in" };
ofstream q{ "rmq.out" };

#define LGMAX 20
#define NMAX 100005

int lg[NMAX];
int rmq[LGMAX][NMAX];
int v[NMAX];
int n, m;

void read()
{
   f >> n >> m;
   for (int i = 1; i <= n; ++i) f >> v[i];
}

void preProcess()
{
   lg[1] = 0;
   rmq[0][1] = v[1];
   for(int i = 2; i <= n; ++i)
   {
      lg[i] = lg[i >> 1] + 1;
      rmq[0][i] = v[i];
   }

   for(int i = 1; i < LGMAX; ++i)
   {
      for(int j = 1; j <= n; ++j)
      {
         rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
      }
   }
}

int query(int st, int dr)
{
   int elems = dr - st + 1;
   int lgdif = lg[elems];
   return min(rmq[lgdif][st], rmq[lgdif][st + (elems - (1 << lgdif))]);
}

void solve()
{
   int st, dr;
   while(m--)
   {
      f >> st >> dr;
      q << query(st, dr) << "\n";
   }
}


int main()
{
   read();
   preProcess();
   solve();


   f.close();
   q.close();
   return 0;
}