Cod sursa(job #2469927)

Utilizator modulopaulModulopaul modulopaul Data 8 octombrie 2019 12:47:14
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define MAXN 1000001
#define MAXM 1001
#define MAXEL 100001

using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int a[MAXN],m[MAXM],sqn;
int rmq(int x,int y){
    int st,fn,minval=MAXEL;
    if(x%sqn!=0){
        minval=a[x];
        x++;
        for(;x%sqn!=0 and x<=y;x++)
            if(minval>a[x])
                minval=a[x];
    }
    if(y%sqn!=sqn-1){
        for(;y%sqn!=sqn-1 and y>=x;y--)
            if(minval>a[y])
                minval=a[y];
    }
    if(x>y)
        return minval;
    for(int i=x/sqn;i<=y/sqn;i++){
        if(minval>a[m[i]])
            minval=a[m[i]];
    }
    return minval;
}
int main(){
    int n,nrq,nrm=-1;
    fin>>n>>nrq;
    sqn=sqrt(n);
    for(int i=0,contsqr=1,minval,pozmin;i<n;i++,contsqr++){
        fin>>a[i];
        if(contsqr>sqn){
            contsqr=1;
            nrm++;
            m[nrm]=pozmin;
            pozmin=i;
            minval=a[i];
        }
        else if(minval>a[i] or i==0){
            minval=a[i];
            pozmin=i;
        }
        if(i==n-1){
            nrm++;
            m[nrm]=pozmin;
        }
    }
    for(int i=1;i<=nrq;i++){
        int x,y;
        fin>>x>>y;
        fout<<rmq(x-1,y-1)<<'\n';
    }
    return 0;
}