Cod sursa(job #2890449)

Utilizator 0SiSBesliu Radu-Stefan 0SiS Data 15 aprilie 2022 17:04:26
Problema Range minimum query Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

int n, m, x, y;
int sparseTable[100001][20];

vector < int > v;

int main() {
  f >> n >> m;
  v.resize(n);
  for (auto &element : v) {
    f >> element;
  }

  for (int i = 0; i < n; ++i) {
    sparseTable[i][0] = i;
  }

  // preprocesare
  for (int j = 1; (1 << j) <= n; ++j) {
    for (int i = 0; (i + (1 << j) - 1) < n; ++i) {
      if (v[sparseTable[i][j - 1]] < v[sparseTable[i + (1 << (j - 1))][j - 1]]) {
        sparseTable[i][j] = sparseTable[i][j - 1];
      }
      else {
        sparseTable[i][j] = sparseTable[i + (1 << (j - 1))][j - 1];
      }
    }
  }

  // query
  for (int i = 0; i < m; ++i) {
    f >> x >> y;
    if (x > y) swap(x, y);
    --x;
    --y;
    int j = (int)log2(y - x + 1);
    if (v[sparseTable[x][j]] <= v[sparseTable[y - (1 << j) + 1][j]]) {
      g << v[sparseTable[x][j]] << '\n';
    }
    else {
      g << v[sparseTable[y - (1 << j) + 1][j]] << '\n';
    }
  }
}