Cod sursa(job #1344352)

Utilizator ooptNemes Alin oopt Data 16 februarie 2015 17:40:37
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
/// rmq
#include <iostream>
#include <fstream>
#include <algorithm>

#define NMax 100005

using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

int n,m;
int ARB[5 * NMax];
int val, pos;
int start, finish;
int maxim;

void update(int nod, int left, int right) {
    if (left == right) {
        ARB[nod] = val;
        return;
    }

    int mid = (left+right)/2;
    if (pos <= mid) update(2*nod, left, mid);
    else update(2*nod+1, mid+1, right);
    ARB[nod] = min(ARB[2*nod], ARB[2*nod+1]);
}

void query(int nod, int left, int right) {
    if (start <= left && right <= finish) {
        if (ARB[nod] < maxim)
            maxim = ARB[nod];
        return;
    }

    int mid = (left+right)/2;
    if (start <= mid) query(2*nod, left, mid);
    if (mid < finish) query(2*nod+1, mid+1, right);
}

void read() {
    f>>n>>m;
    for (int i=1;i<=n;i++) {
        int x; f>>x;
        val = x;
        pos = i;
        update(1,1,n);
    }

    for (int i=1;i<=m;i++) {
        int x, y;
        f>>x>>y;
        start = x; finish = y;
        maxim = 1<<30;
        query(1,1,n);
        g<<maxim<<'\n';
    }
}

int main() {

    read();

    f.close(); g.close();
    return 0;
}