Cod sursa(job #2741947)

Utilizator davidenko22Stancu David-Andrei davidenko22 Data 19 aprilie 2021 19:59:35
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <bits/stdc++.h>

using namespace std;

const int mxn = 1e5 + 1;
const int mxm = 17;

int n, m;

int rmq[mxm][mxn];

inline int minInterval(int x, int y){
    int nr = 0;
    int dist = y - x + 1;
    int dist1 = y - x + 1;
    while (dist) {
      dist /= 2;
      nr++;
    }
    nr--;
    dist = (1 << nr);
    return min(rmq[nr][x - 1], rmq[nr][x - 1 + (dist1 - dist)]);
}

int main()
{
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");
    fin >> n >> m;
    for ( int i = 0; i < n; i++ ) {
      fin >> rmq[0][i];
    }
    for ( int i = 1; (1 << i) < n; i++ ) {
      int x = (1 << i);
      for ( int j = 0; j + x <= n; j++ ) {
        rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + x/2]);
      }
    }
    for ( int i = 0; i < m; i++ ) {
        int x, y;
        fin >> x >> y;
        fout << minInterval(x, y) << '\n';
    }
    return 0;
}