Cod sursa(job #2283908)

Utilizator ZappaManIosif Adrian-Mihai ZappaMan Data 15 noiembrie 2018 23:53:42
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <stdio.h>
#include <math.h>

const int NMAX = 100000;
const int LOGN = 20;

int N, M;

int dp[NMAX][LOGN];
int vec[NMAX];
int lg[LOGN + 2];

int main() {
   freopen("rmq.in", "r", stdin);
   freopen("rmq.out", "w", stdout);


   scanf("%d%d",&N,&M);

   for (int i = 0; i < N; ++i) {
      scanf("%d",&vec[i]);
   }

   lg[1] = 0;
   for (int i = 2; i <= N; ++i) {
      lg[i] = lg[i/2] + 1;
   }

   for (int i = 0; i <= N; ++i) {
      for (int j = 0; j <= lg[N]; ++j) {
         dp[i][j] = NMAX + 10;
      }
   }

   for (int i = 0; i < N; ++i) {
      dp[i][0] = vec[i];
   }

   for (int j = 1; (1 << j) <= N; j++) {
      int sh = (1 << (j-1));
      for (int i = 0; i + sh - 1 < N; ++i) {
         if (dp[i][j-1] <= dp[i+sh][j-1]) {
            dp[i][j] = dp[i][j-1];
         } else {
            dp[i][j] = dp[i+sh][j-1];
         }
      }
   }

   //for (int i = 0; i < N; ++i) {
      //for (int j = 0; j < LOGN; ++j) {
         //printf("%d ",dp[i][j]);
      //}
      //printf("\n");
   //}

   for (int i = 0; i < M; ++i) {
      int n1, n2;
      scanf("%d%d",&n1, &n2);
      n1--; n2--;
      int k = lg[n2-n1 + 1];
      int val = 0;
      if (dp[n1][k] < dp[n2 - (1 << k)+1][k]) {
         val = dp[n1][k];
      } else {
         val = dp[n2 - (1 << k)+1][k];
      }
      printf("%d\n", val);
   }

   return 0;
}