Cod sursa(job #1390411)

Utilizator c0rn1Goran Cornel c0rn1 Data 17 martie 2015 00:49:33
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define NMAX 100008
#define LMAX 25
#define inf 0x3f3f3f3f

using namespace std;

int n, m, a[NMAX], best[NMAX][LMAX], log[NMAX];

void preCalc()
{
   for (int i = 2; i <= n; ++i){
      log[i] = log[i/2] + 1;
   }
   for (int i = 1; i <= n; ++i){
      best[i][0] = a[i];
   }
   for (int j = 1; j <= log[n]; ++j){
      for (int i = 1; i <= n - (1<<j) + 1; ++i){
         best[i][j] = min(best[i][j-1], best[i+(1<<(j-1))][j-1]);
      }
   }
}

int main()
{
   freopen("rmq.in", "r", stdin);
   freopen("rmq.out", "w", stdout);
   scanf("%d %d\n", &n, &m);
   for (int i = 1; i <= n; ++i)
      scanf("%d\n", &a[i]);
   preCalc();
   int x, y;
   for (int i = 1; i <= m; ++i){
      scanf("%d %d\n", &x, &y);
      printf("%d\n", min(best[x][log[y-x+1]], best[y - (1<<log[y-x+1]) + 1][log[y-x+1]]));
   }

   return 0;
}