Cod sursa(job #2425077)

Utilizator cyg_TheoPruteanu Theodor cyg_Theo Data 24 mai 2019 11:09:52
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int NMAX = 100002;
const int LOGMAX = 20;

long int rmq[LOGMAX][NMAX];
long int v[NMAX];

long int logg[NMAX];

void setup_rmq(int n){
    logg[1]=0;
    for(int i=2;i<=n;++i)
        logg[i]=logg[i/2]+1;

    for(int i=1;i<=n;++i)
        rmq[0][i]=v[i];

    for(int i=1;(1<<i)<=n;++i)
      for(int j=1;j+(1<<i)-1<=n;++j)
        rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
}

long int get_rmq(int a,int b){
    int diff=b-a+1;
    int l=logg[diff];

    return min(rmq[l][a],rmq[l][b+1-(1<<l)]);
}

int main(){
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    int n,q;
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;++i){
        scanf("%d",&v[i]);
    }

    setup_rmq(n);

    int x,y;

//    for(int i=0;(1<<i)<=n;++i){
//      for(int j=1;j<=n-(1<<i)+1;++j)
//          printf("%ld ",rmq[i][j]);
//      printf("\n");
//    }

    for(int i=1;i<=q;++i){
        scanf("%d%d",&x,&y);
        printf("%ld\n",get_rmq(x,y));
    }

    return 0;
}