Cod sursa(job #2847308)

Utilizator GligarEsterabadeyan Hadi Gligar Data 10 februarie 2022 16:38:55
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 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[nmax+1][nmax2+1], lg[nmax+1];

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

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

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