Cod sursa(job #2013699)

Utilizator tudoras8tudoras8 tudoras8 Data 22 august 2017 08:59:00
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <iostream>
#include <fstream>

const int MAXN = 100001, MAXLN = 18;
int n, m, rmq[MAXLN][MAXN], lg[MAXN];

using namespace std;

int main(int argc, const char * argv[]) {
    ifstream cin("rmq.in");
    ofstream cout("rmq.out");

    cin >> n >> m;
    
    // Preprocessing step
    lg[1] = 0;
    for (int i = 2; i <= n; i++) {
        lg[i] = lg[i/2] + 1;
    }
    
    for (int j = 1; j <= n; j++) {
        cin >> rmq[0][j];
    }
    for (int i = 1; (1 << i) <= n; i++) {
        for (int j = 1; j + (1 << i) - 1 <= n; j++) {
            int l = 1 << (i - 1);
            rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+l]);
        }
    }
    
    // Query step
    int left, right;
    for (int i = 0; i < m; i++) {
        cin >> left >> right;
        
        int diff = right - left + 1;
        int t = lg[diff];
        int sh = diff - (1 << t);
        
        cout << min(rmq[t][left], rmq[t][left + sh]) << "\n";
    }

    cout << "\n";
    
    return 0;
}