Cod sursa(job #2055642)

Utilizator b0gd4nBogdan b0gd4n Data 3 noiembrie 2017 15:50:44
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#include <stdio.h>

#define MAXN 100000 + 2

using namespace std;

int N, M;
int RMQ[17][MAXN]; //2^16<=MAXN.
int Lg[MAXN]; //Lg[ i ] = K, 2^K<=i;

FILE *f, *g;

int main()
{
  f = fopen("rmq.in",  "r");
  g = fopen("rmq.out", "w");

  fscanf(f, "%d %d", &N, &M);

  for (int i = 1; i <= N; i++)
    fscanf(f, "%d", &RMQ[ 0 ][ i ]);

  //Compute Lg.
  Lg[1] = 0;
  for (int i = 2; i <= N; i++)
    Lg[i] = Lg[ i / 2 ] + 1;

  //RMQ array.
  for (int i = 1; (1 << i) <= N; i++)
    for (int j = 1; j <= N - (1 << i) + 1; j++)
      RMQ[ i ][ j ] = std::min(RMQ[ i - 1 ][ j ], RMQ[ i - 1 ][ j + (1 << (i - 1)) ]);

  for (int i = 1, X, Y; i <= M; i++)
  {
    fscanf(f, "%d %d", &X, &Y);

    int Length = Y - X + 1;
    int K = Lg[ Length ]; //2^K<=Length, K maximum.

    int Answer = std::min(RMQ[ K ][ X ], RMQ[ K ][ Y - (1 << K) + 1 ]);

    fprintf(g, "%d\n", Answer);
  }


  fclose(f);
  fclose(g);

  return 0;
}