Cod sursa(job #2849808)

Utilizator ptlsebiptl sebi ptlsebi Data 15 februarie 2022 20:09:32
Problema Range minimum query Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>
#include <stdint.h>

void read_uint32_t(FILE *__restrict stream, uint32_t *__restrict nr) {
  uint8_t ch;
  *nr = 0;
  while ((ch = fgetc(stream)) && ('0' <= ch && ch <= '9')) {
    *nr *= 10;
    *nr += ch - '0';
  }
  if (ch == '\r') {
    fgetc(stream);
  }
}
uint32_t __inline__ min(uint32_t o1, uint32_t o2) {
  return o1 < o2 ? o1 : o2;
}

uint32_t n, m;
uint32_t rmq[17][100001];

void build_rmq() {
  int32_t i, j;
  uint32_t cp = 0;
  for(i = 1; i <= 16; ++i) {
    cp = 1 << (i-1);
    for(j = cp; j < n; ++j) {
      rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j-cp]);
    }
  }
}

uint32_t l[100001];

void build_log() {
  l[0] = 0;
  l[1] = 0;
  l[2] = 1;
  uint32_t i;
  for(i = 3; i <= n; ++i) {
    l[i] = l[i>>1] + 1;
  }
}

int main(void) {
  {
    FILE *__restrict in = fopen("rmq.in", "r");
    FILE *__restrict out = fopen("rmq.out", "w");
  
    read_uint32_t(in, &n);
    read_uint32_t(in, &m);
    int32_t i;
    for(i = 0; i < n; ++i) {
      read_uint32_t(in, rmq[0]+i);
    }

    build_rmq();
    build_log();

    uint32_t x, y;
    uint32_t dif;
    for(i = 0; i < m; ++i) {
      read_uint32_t(in, &x);
      --x;
      read_uint32_t(in, &y);
      --y;
      dif = y - x + 1;

      fprintf(out, "%u\n", 
          min(rmq[l[dif]][y],
              rmq[l[dif]][x + (1 << l[dif]) - 1]));
    }
  
    fclose(out);
    fclose(in);
  }
  return 0;
}