Cod sursa(job #2922761)

Utilizator Alex_HossuHossu Alexandru Alex_Hossu Data 9 septembrie 2022 21:57:05
Problema Range minimum query Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <stdio.h>

#define MAX_N 100005

int vec[MAX_N];
int rmq[20][MAX_N];

static inline int min(int a, int b) { return a < b ? a : b; }

void InitRMQ(int n) {
  for (int lvl = 1; (1 << lvl) <= n; lvl++) {
    for (int index = 0; index + (1 << lvl) <= n; index++) {
      rmq[lvl][index] = min(rmq[lvl - 1][index], rmq[lvl - 1][index + (1 << (lvl - 1))]);
    }
  }
}

int query(int pos1, int pos2) {
  int put = 0;
  for (int val = 16; val; val >>= 1) {
    if (1 << (put + val) < pos2 - pos1 + 1) {
      put += val;
    }
  }
  return min(rmq[put][pos1], rmq[put][pos2 - (1 << put) + 1]);
}

int main() {
  FILE *fin, *fout;
  int n, m;
  int i, pos1, pos2;

  fin = fopen("rmq.in", "r");

  fscanf(fin, "%d%d", &n, &m);
  for (i = 0; i < n; i++) {
    fscanf(fin, "%d", &vec[i]);
    rmq[0][i] = vec[i];
  }
  InitRMQ(n);

  fout = fopen("rmq.out", "w");

  for (i = 0; i < m; i++) {
    fscanf(fin, "%d%d", &pos1, &pos2);
    fprintf(fout, "%d\n", query(pos1 - 1, pos2 - 1));
  }

  fclose(fin);
  fclose(fout);

  return 0;
}