Cod sursa(job #2819650)

Utilizator Alex_HossuHossu Alexandru Alex_Hossu Data 18 decembrie 2021 19:42:51
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

const int MAXN = 1e5;
const int MAXLOG = 17;

int logVect[MAXN];
int v[MAXN];
int a[MAXLOG + 1][MAXN];

int query(int left, int right) {
  int len = logVect[right - left + 1];
  return min(a[len][left], a[len][right - (1 << len) + 1]);
}

int main() {
  FILE *fin, *fout;
  int n, m, i, pow, left, right;

  fin = fopen("rmq.in", "r");
  fscanf(fin, "%d%d", &n, &m);

  for (i = 2; i <= n; i++)
    logVect[i] = logVect[i / 2] + 1;

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

  for (i = 0; i < n; i++)
    a[0][i] = v[i];

  for (pow = 1; pow <= logVect[n]; pow++) {
    for (i = 0; i <= n - (1 << pow); i++)
      a[pow][i] = min(a[pow - 1][i], a[pow - 1][i + (1 << (pow - 1))]);
  }

  fout = fopen("rmq.out", "w");
  for (i = 0; i < m; i++) {
    fscanf(fin, "%d%d", &left, &right);
    left--;
    right--;
    fprintf(fout, "%d\n", query(left, right));
  }

  fclose(fin);
  fclose(fout);

  return 0;
}