Cod sursa(job #2284030)

Utilizator ZappaManIosif Adrian-Mihai ZappaMan Data 16 noiembrie 2018 17:03:43
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 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 + (1 << j) - 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);
   }
   fclose(stdin);
   fclose(stdout);
 
   return 0;
}