Cod sursa(job #2473601)

Utilizator modulopaulModulopaul modulopaul Data 13 octombrie 2019 21:30:31
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <iostream>
#include <fstream>
#define MAXN 100001
#define LOGMAXN 5
#include <cmath>

using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int m[MAXN][LOGMAXN];
int a[MAXN],n;
void preprocess(){
    for(int i=0;i<n;i++)
        m[i][0]=i;
    for(int j=1;1<<j<=n;j++){
        for(int i=0;i+(1<<j)-1<n;i++){
            if(a[m[i][j-1]]<a[m[i+(1<<(j-1))][j-1]])
                m[i][j]=m[i][j-1];
            else
                m[i][j]=m[i+(1<<(j-1))][j-1];
        }
    }
}
int rmq(int x,int y){
    int dif=y-x+1,sh;
    int k=(int)log(dif);
    sh=dif-(1<<k);
    if(a[m[x][k]]<=a[m[x+sh][k]])
        return m[x][k];
    else
        return m[x+sh][k];
}
int main(){
    int nrq;
    fin>>n>>nrq;
    for(int i=0;i<n;i++){
        fin>>a[i];
    }
    preprocess();
    for(int i=1;i<=nrq;i++){
        int x,y;
        fin>>x>>y;
        fout<<a[rmq(x-1,y-1)]<<'\n';
    }
    return 0;
}