Cod sursa(job #3299973)

Utilizator LucaMuresanMuresan Luca Valentin LucaMuresan Data 12 iunie 2025 09:47:46
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
#include <iostream>
#pragma GCC optimize("O3,unroll-loops")


#define FILE_IN "rmq.in"
#define FILE_OUT "rmq.out"
#define BUFF_SIZE (1 << 15)
#define MAX_DIG_LEN 6


FILE *file_in, *file_out;
char buff[BUFF_SIZE], obuff[BUFF_SIZE], num_buff[MAX_DIG_LEN];
int pos = 0, opos = 0;

static inline void init_parsing() {
    file_in = fopen(FILE_IN, "r");
    file_out = fopen(FILE_OUT, "w");
    fread(buff, 1, BUFF_SIZE, file_in);
}

static inline void finish_parsing() {
    fwrite(obuff, 1, opos, file_out);
    fclose(file_in);
    fclose(file_out);
}

static inline void read_int(int &n) {
    while (isspace(buff[pos])) {
        pos++;
        if (pos == BUFF_SIZE) {
            fread(buff, 1, BUFF_SIZE, file_in);
            pos = 0;
        }
    }

    int nr = 0;

    while (isdigit(buff[pos])) {
        nr = nr * 10 + buff[pos++] - '0';
        if (pos == BUFF_SIZE) {
            fread(buff, 1, BUFF_SIZE, file_in);
            pos = 0;
        }
    }

    n = nr;
}

static inline void write_ch(char ch) {
    obuff[opos++] = ch;
    if (opos == BUFF_SIZE) {
        fwrite(obuff, 1, BUFF_SIZE, file_out);
        opos = 0;
    }
}

static inline void write_int(int n) {
    int idx = 0;
    do {
        num_buff[++idx] = n % 10 + '0';
        n /= 10;
    } while (n > 0);

    while (idx)
        write_ch(num_buff[idx--]);
}


const int NMAX = 1e5;
const int QMAX = 1e6;
const int LGMAX = 16;

int rmq[LGMAX + 1][NMAX + 1];
int lg2[NMAX + 1];

int main() {
  init_parsing();

  int n, q;
  read_int(n);
  read_int(q);

  for (int i = 0; i < n; i++) {
    read_int(rmq[0][i]);
  }
  for (int j = 1; j <= LGMAX; j++) {
    for (int i = 0; i + (1 << j) - 1 < n; i++) {
      rmq[j][i] = std::min(rmq[j - 1][i], rmq[j - 1][i + (1 << (j - 1))]);
    }
  }
  for (int i = 2; i <= n; i++) {
    lg2[i] = lg2[i >> 1] + 1;
  }

  for (int i = 0; i < q; i++) {
    int l, r;
    read_int(l);
    read_int(r);
    int k = lg2[r - l + 1];
    write_int(std::min(rmq[k][l - 1], rmq[k][r - (1 << k)]));
    write_ch('\n');
  }

  finish_parsing();

  return 0;
}