Cod sursa(job #1315532)

Utilizator retrogradLucian Bicsi retrograd Data 12 ianuarie 2015 21:36:27
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include<fstream>

#define MAXN 100005

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int RMQ[20][MAXN], lg[MAXN];

int i, j;
void init (int n) {
    for(i = 1; (1 << i) <= n; i ++) {
        for(j = 0; j < n - (1 << i) + 1; j ++) {
            RMQ[i][j] = min(RMQ[i-1][j], RMQ[i-1][j + (1 << (i-1))]);
        }
    }
}

int rmq (int b, int e) {
    i = lg[e - b + 1];
    b--;e--;
    return min(RMQ[i][b], RMQ[i][ e + 1 - (1 << i)]);
}



int main() {
    int n, q, b, e;
    lg[0] = -2;
    fin>>n>>q;
    for(int i=0; i<n; i++) {
        fin>>RMQ[0][i];
        lg[i] = lg[i/2] + 1;
    }

    init(n);

    while(q--) {
        fin>>b>>e;
        if(b>e) swap(b, e);
        fout<<rmq(b, e)<<"\n";
    }

    return 0;
}