Cod sursa(job #2189740)

Utilizator lulian23Tiganescu Iulian lulian23 Data 28 martie 2018 21:42:17
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 100002;

long long n, m, l;
int a[ NMAX ];
int lg[ NMAX ];
int rmq[ 18 ][ NMAX ];

int main(){
    ios_base::sync_with_stdio(false);

    ifstream cin("rmq.in");
    ofstream cout("rmq.out");

    cin >> n >> m;

    for (int i = 1; i <= n; ++i)
        cin >> a[ i ];

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

    for (int i = 1; i <= n; ++i)
        rmq[ 0 ][ i ] = a[ i ];

    for (int i = 1; (1 << i) <= n; ++i)
        for (int j = 1; j <= n - (1 << i) + 1; ++j){
            l = 1 << (i - 1);
            rmq[ i ][ j ] = min(rmq[ i - 1 ][ j ], rmq[ i - 1 ][ j + 1 ]);
        }

    int diff, sh;

    for (int i = 1, x, y; i <= m; ++i){
        cin >> x >> y;
        diff = y - x + 1;
        l = lg[ diff ];
        sh = diff - (1 << l);
        cout << min(rmq[ l ][ x ], rmq[ l ][ x + sh ]) << '\n';
    }
}