Cod sursa(job #2803360)

Utilizator Teodor94Teodor Plop Teodor94 Data 19 noiembrie 2021 21:30:15
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;

#define MAX_V 1000000
#define MAX_N 100000
const int SQ_N = sqrt(MAX_N);
const int BATOG_SIZE = (MAX_N + SQ_N - 1) / SQ_N;

int v[MAX_N];
int vLength;

int batog[BATOG_SIZE];

void build() {
  int i;

  for (i = 0; i < BATOG_SIZE; ++i)
    batog[i] = MAX_V;

  for (i = 0; i < vLength; ++i)
    batog[i / SQ_N] = min(batog[i / SQ_N], v[i]);
}

inline void update(int pos, int value) {
  batog[pos / SQ_N] += value - v[pos];
  v[pos] = value;
}

int query(int left, int right) {
  int firstInterval, lastInterval, mmin;

  firstInterval = (left + SQ_N - 1) / SQ_N * SQ_N;
  lastInterval = right / SQ_N * SQ_N;

  mmin = MAX_V;
  while (left <= right && left < firstInterval)
    mmin = min(mmin, v[left++]);
  while (right >= left && right >= lastInterval)
    mmin = min(mmin, v[right--]);

  firstInterval /= SQ_N;
  lastInterval /= SQ_N;

  while (firstInterval < lastInterval)
    mmin = min(mmin, batog[firstInterval++]);

  return mmin;
}

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

  int i, q, a, b;

  fscanf(fin, "%d%d", &vLength, &q);
  for (i = 0; i < vLength; ++i)
    fscanf(fin, "%d", &v[i]);

  build();

  while (q--) {
    fscanf(fin, "%d%d", &a, &b);
    --a, --b;
    fprintf(fout, "%d\n", query(a, b));
  }

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