Cod sursa(job #1615666)

Utilizator avaspAva Spataru avasp Data 26 februarie 2016 19:04:36
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<cstdio>
int n,m,d[17][200001],x,y,put,doila,q,qq,el,rez;

int minim(int nr1,int nr2){
    if(nr1<=nr2)
        return nr1;
    return nr2;
}

int main(){
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=0;i<=16;i++)
        for(int j=1;j<=200000;j++)
            d[i][j]=200001;
    for(int i=1;i<=n;i++){
        scanf("%d",&el);
        d[0][i]=el;
    }
    q=1;
    put=2;
    while(put<n){
        put*=2;
        q++;
    }
    int doila=1;
    for(int i=1;i<=q;i++){
        for(int j=1;j<=n;j++)
            d[i][j]=minim(d[i-1][j],d[i-1][j+doila]);
        doila*=2;
    }

    for(int qq=1;qq<=m;qq++){
        scanf("%d%d",&x,&y);
        q=0;
        put=1;
        while(put<(y-x)){
            put*=2;
            q++;
        }
        rez=minim(d[q][x],d[q][y-put+1]);
        printf("%d\n",rez);
    }
    return 0;
}