Cod sursa(job #2029296)

Utilizator stoianmihailStoian Mihail stoianmihail Data 29 septembrie 2017 20:01:27
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <cstdio>

#define MAX_N 100000
#define LOG 18

int N, M;
int rmq[LOG][MAX_N + 1];
int lg[MAX_N + 1];

int MIN(int X, int Y) {
  return X < Y ? X : Y;
}

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

int main(void) {
  int i;
  FILE *f = fopen("rmq.in", "r");

  fscanf(f, "%d %d", &N, &M);
  init();
  for (i = 1; i <= N; i++) {
    fscanf(f, "%d", &rmq[0][i]);
  }

  int u;
  for (i = 1; i <= lg[N]; i++) {
    for (u = 1; u <= N; u++) {
      rmq[i][u] = MIN(rmq[i - 1][u], rmq[i - 1][u + (1 << (i - 1))]);
    }
  }

  freopen("rmq.out", "w", stdout);
  int x, y, curr;
  while (M) {
    fscanf(f, "%d %d", &x, &y);
    curr = lg[y - x + 1];
    fprintf(stdout, "%d\n", MIN(rmq[curr][x], rmq[curr][y - (1 << curr) + 1]));
    M--;
  }
  fclose(f);
  fclose(stdout);
  return 0;
}