Cod sursa(job #2844853)

Utilizator GligarEsterabadeyan Hadi Gligar Data 5 februarie 2022 18:48:19
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>

using namespace std;

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

const int nmax=100000, nmax2=16, inf=(1<<30)-1;

int v[nmax2+1][nmax+1], log[nmax+1];

int Min(int a, int b){
    if(a<=b){
        return a;
    }else{
        return b;
    }
}

void test(int n){
    int n2=2*n-(n&(n-1));
    for(int i=0;(1<<(i-1))<=n;i++){
        for(int j=1;j<=n2-(1<<i)+2;j++){
            fout<<v[i][j]<<" ";
        }
        fout<<"\n";
    }
    fout<<"\n";
}

int main(){
    int n,m;
    fin>>n>>m;
    for(int i=0;i<=16;i++){
        for(int j=1;j<=2*n;j++){
            v[i][j]=inf;
        }
    }
    for(int i=1;i<=nmax;i++){
        log[i]=log[i-1];
        if(i==(1<<(log[i]+1))){
            log[i]++;
        }
    }
    for(int i=1;i<=n;i++){
        fin>>v[0][i];
    }
    int n2=2*n-(n&(n-1));
    for(int i=1;(1<<(i-1))<=n;i++){
        for(int j=1;j<=n2-(1<<i)+2;j++){
            v[i][j]=Min(v[i-1][j],v[i-1][j+i]);
        }
    }
    //test(n);
    for(int i=1;i<=m;i++){
        int x,y;
        fin>>x>>y;
        int log2=log[y-x+1];
        fout<<Min(v[log2][x],v[log2][1+y-(1<<log2)])<<"\n";
    }
    return 0;
}