Cod sursa(job #1398208)

Utilizator casuneanu.andreiCasuneanu Andrei Dan casuneanu.andrei Data 24 martie 2015 01:32:39
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
using namespace std;
#define IN "rmq.in"
#define OUT "rmq.out"
#define DMAX 100008
#define LOGMAX 20
ifstream fin(IN);
ofstream fout(OUT);

int n, ma;
int v[DMAX];
int m[DMAX][LOGMAX];
int putere[LOGMAX];

void citire();
void dinamica();
int rmq(int, int);
int log(int);
inline int minim(int a, int b){
    if (a<b)
        return a;
    return b;
}

int main(){
    citire();
    return 0;
}

int log(int x){
    int i;
    for (i=LOGMAX-1; i>=0; --i)
        if (putere[i]<=x)
            return i;
    return 0;
}

void dinamica(){
    int i, j;
    for (i=1; i<=n; ++i)
        m[i][0]=v[i];
    //m -> pozitia
    for (j=1; putere[j]<=n; ++j)
        for (i=1; i+putere[j]-1<=n; ++i)
            m[i][j]=minim(m[i][j-1], m[i+putere[j-1]][j-1]);
}

int rmq(int i, int j){
    int len=j-i+1;
    int k=log(len);
    int x=len-putere[k];
    return minim(m[i][k], m[i+x][k]);
}

void citire(){
    fin >>n>>ma;

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

    for (i=0; i<LOGMAX; ++i)
        putere[i]=1<<i;

    //dinamica
    dinamica();
    //intrebare
    int x, y;
    for (i=1; i<=ma; ++i){
        fin >>x>>y;
        fout <<rmq(x, y)<<'\n';
    }
    fout.close();
}