Cod sursa(job #1129647)

Utilizator klamathixMihai Calancea klamathix Data 28 februarie 2014 00:48:25
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
const int maxn = 1e5 + 5;
int n, m;
vector<int> v, aib;

inline int lsb(int x) {
    return (x & (-x));
}

void update(int poz, int value) {
    while(poz <= n) {
        aib[poz] = min(aib[poz], value);
        poz += lsb(poz);
    }
}

int query(int a, int b) {
    int ans = maxn;

    while(b != a) {
        if(b - lsb(b) >= a) {
            ans = min(ans, aib[b]);
            b -= lsb(b);
        } else {
            ans = min(ans, v[b]);
            b--;
        }
    }

    ans = min(ans, v[a]);
    return ans;
}

int main() {
   
    #ifdef INFOARENA
    ifstream cin("rmq.in");
    ofstream cout("rmq.out");
    #endif

    cin >> n >> m;
    v = vector<int> (n + 1, 0);
    aib = vector<int> (n + 1, maxn);

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

    for(int i = 1; i <= m; ++i) {
        int a, b; cin >> a >> b;
        cout << query(a, b) << "\n";
    }
}