Cod sursa(job #3337992)

Utilizator Viorel_PaulViorel-Paul Stoleri Viorel_Paul Data 31 ianuarie 2026 09:49:28
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>
#define NM 100001
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");


int E[NM],a[NM],rmin[17][NM];
int n,q,st,dr;



void loge(){
    //E[i]=exponentul celei mai mari
    //puteri de 2 mai mica sau egala cu i
    E[1]=0;
    for(int i=2;i<=n;i++)
        E[i]=1+E[i/2];
}

void rminq(){
    //a[putere][ind]= secventa de lungime din a[] 2 la putere care incepe la ind
    for(int i=1;i<=n;i++)
        rmin[0][i]=a[i];
    
    for(int p=1;(1<<p)<=n;p++){
        for(int i=1;i<=n;i++){
            int j=i+(1<<(p-1));
            if(j<=n)
                rmin[p][i]=min(rmin[p-1][j],rmin[p-1][i]);
        }
    }
}



int main(){
    cin>>n>>q;
    
    for(int i=1;i<=n;i++)
        cin>>a[i];
    
    loge();
    rminq();
    for(int k=1;k<=q;k++){
        cin>>st>>dr;
        int putere=E[dr-st+1];
        int lung=(1<<putere);
        cout<<min(rmin[putere][st],rmin[putere][dr-lung+1])<<"\n";
    }
    
    
}