Cod sursa(job #2471776)

Utilizator modulopaulModulopaul modulopaul Data 11 octombrie 2019 15:05:34
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 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 k=(int)log(y-x+1);
    if(a[m[x][k]]<=a[m[y-(1<<k)+1][k]])
        return m[x][k];
    else
        return m[y-(1<<k)+1][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;
}