Cod sursa(job #2432175)

Utilizator pickleVictor Andrei pickle Data 22 iunie 2019 14:16:31
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.8 kb
#include <stdio.h>
#include <bits/stdc++.h>

#define rep(i, n) for(int i = 0; i < n; i++)

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int Nmax = 100555;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");

int N, M, A[Nmax], lg[Nmax];
int R[18][Nmax];

int main(void) {
  fin >> N >> M;
  rep(i, N) { fin >> A[i]; }
  // pre-process
  lg[1] = 0;
  for(int n = 2; n <= N; ++n)
    lg[n] = lg[n/2] + 1;
  rep(i,N) { R[0][i] = A[i]; }

  for(int j = 1; (1<<j) <= N; j++)
  for(int i = 0; i + (1<<j) - 1 < N; i++) {
    int x = 1 << (j-1);
    R[j][i] = min(R[j-1][i], R[j-1][i+x]);
  }

  int a,b;
  rep(i, M) {
    fin >> a >> b;
    --a, --b;
    int diff = b-a+1;
    int l = lg[diff];
    fout << min(R[l][a], R[l][b+1-(1<<l)]) << '\n';
  }

  return 0;
}