Cod sursa(job #1088284)

Utilizator harababurelPuscas Sergiu harababurel Data 20 ianuarie 2014 13:55:33
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <iostream>
#include <fstream>
#define nmax 100005
#define mmax 1000005
#define logmax 20
#define inf (1<<30)
using namespace std;

int v[nmax], exp[nmax], M[nmax][logmax];
int n, m, a, b;

int RMQ(int i, int j) {
    //int k = 0;
    //while((1<<(k+1))<=j-i+1) k++;   //k = log_2 DIM
    int k = exp[j-i+1];
    return min(M[i][k], M[j-(1<<k)+1][k]);
}


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

    f>>n>>m;
    for(int i=1; i<=n; i++) f>>v[i];

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

    for(int i=1; i<=n; i++) M[i][0] = v[i];
    for(int j=1; (1<<j)<=n; j++)
        for(int i=1; i<=n; i++) M[i][j] = inf;

    for(int j=1; (1<<j)<=n; j++)
        for(int i=1; i+(1<<j)-1<=n; i++)
            //construiesc M[i][j], pe baza lui M[i][j-1] si M[i+2^(j-1)][j-1]
            M[i][j] = min(M[i][j-1], M[i+(1<<(j-1))][j-1]);


    for(int i=1; i<=m; i++) {
        f>>a>>b;
        g<<RMQ(a, b)<<"\n";
    }



    return 0;
}