Cod sursa(job #2386716)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 23 martie 2019 15:35:03
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>
#define all(cont) cont.begin(), cont.end()
#define pb push_back
#define fi first
#define se second
#define DEBUG(x) cerr << (#x) << ": " << (x) << '\n'

using namespace std;

typedef pair <int, int> pii;
typedef vector <int> vi;
typedef long long ll;
typedef unsigned long long ull;

template <class T> void uin (T &a, T b) {a = min (a, b);}
template <class T> void uax (T &a, T b) {a = max (a, b);}

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

const int NMAX = 1e5 + 5;
const int LOGMAX = 20;

int v[NMAX];
int lg[NMAX];
int rmq[NMAX][LOGMAX];

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
#ifdef LOCAL_DEFINE
  freopen (".in", "r", stdin);
#endif

  int n, m;
  f >> n >> m;
  for (int i = 1; i <= n; ++i) {
    f >> v[i];
  }

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

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

  for (int len = 2; (len >> 1) <= n; len <<= 1) {
    for (int i = 1; i + len - 1 <= n; ++i) {
      int l = lg[len];
      rmq[i][l] = min(rmq[i][l - 1], rmq[i + len / 2][l - 1]);
    }
  }

  while (m--) {
    int x, y;
    f >> x >> y;
    int len = y - x + 1;
    len = lg[len];

    g << min(rmq[x][len], rmq[y - (1 << len) + 1][len]) << '\n';
  }

  f.close();
  g.close();

#ifdef LOCAL_DEFINE
  cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
  return 0;
}