Cod sursa(job #1390352)

Utilizator c0rn1Goran Cornel c0rn1 Data 16 martie 2015 23:17:23
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define NMAX 100008
#define inf 0x3f3f3f3f

using namespace std;

int n, m, a[NMAX], best[NMAX][25], sqroot;

void preCalc()
{
   for (int i = 1; i <= n; ++i){
      memset(best[i], inf, sizeof(best[i]));
      best[i][0] = a[i];
   }
   for (int i = 1; i <= n; ++i){
      for (int j = 1; j*j <= n; ++j){
         best[i][j] = min(best[i][j-1], a[i+j]);
      }
   }
   for (int j = 1; j*j <= n; ++j, ++sqroot);
}

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 mini, x, y, dif;
   for (int i = 1; i <= m; ++i){
      mini = inf;
      scanf("%d %d\n", &x, &y);
      dif = y - x;
      if (dif <= sqroot)
         mini = best[x][dif];
      else if (dif > sqroot && dif <= 2 * sqroot)
         mini = min(best[x][sqroot], best[x + sqroot][dif - sqroot]);
      else
         mini = min(best[x][sqroot], min(best[x + sqroot][2 * sqroot], best[2 * sqroot + 1][dif - 2 * sqroot]));
      printf("%d\n", mini);
   }

   return 0;
}