Cod sursa(job #2817740)

Utilizator iraresmihaiiordache rares mihai iraresmihai Data 14 decembrie 2021 09:14:07
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>
#include <algorithm>

using namespace std;
#define MAXN 100000
#define LOGMAXN 17

int v[MAXN];
char logp[MAXN + 1];
int rmq[MAXN + 1][LOGMAXN];

void precalc_log(int n) {
  int i;

  logp[0] = logp[1] = 0;

  for ( i = 2; i <= n; i++ ) {
    logp[i] = logp[i / 2] + 1;
  }
}

void build(int n) {
  int i, i2;

  for ( i = 0; i < n; i++ ) {
    rmq[i][0] = v[i];
  }

  for ( i2 = 1; i2 <= logp[n]; i2++ ) {
    for ( i = 0; i + (1 << i2) <= n; i++ ) {
      rmq[i][i2] = min(rmq[i][i2 - 1], rmq[i + (1 << (i2 - 1))][i2 - 1]);
    }
  }
}

int calcAns(int first, int last) {
  char logres;

  logres = logp[last - first + 1];
  return min(rmq[first][logres], rmq[last - (1 << logres) + 1][logres]);
}

int main() {
  FILE *fin, *fout;
  fin = fopen("rmq.in", "r");
  fout = fopen("rmq.out", "w");

  int n, q, i, first, last;

  fscanf(fin, "%d%d", &n, &q);

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

  precalc_log(n);
  build(n);

  for ( i = 0; i < q; i++ ) {
    fscanf(fin, "%d%d", &first, &last);
    fprintf(fout, "%d\n", calcAns(--first, --last));
  }

  fclose(fin);
  fclose(fout);
  return 0;
}