Cod sursa(job #1965906)

Utilizator RaZxKiDDavid Razvan RaZxKiD Data 14 aprilie 2017 18:36:15
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <set>

using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");

int n,qs;

int block_size;
int V[100005];
int BLOCKS[320];

void read(){
    in>>n>>qs;
    for(int i=1;i<=n;i++)
        in>>V[i];
}

void build(){
    int block=0;
    block_size=sqrt(n);
    for(int i=0;i<=block_size;i++)
        BLOCKS[i]=1<<25;
    for(int i=1;i<=n;i++){
        if(i%block_size==0){
            block++;
        }
        BLOCKS[block]=min(BLOCKS[block],V[i]);
    }
}
/*void update(int ind, int val){
    int block_no = ind/block_size;
    block[block_no]+=-V[ind]+val;
    V[ind]=val;
}*/
int query(int x, int y){
    int mini=1<<25;
    while(x<y && x%block_size!=0 && x!=0){
        mini=min(mini,V[x]);
        x++;
    }
    while(x+block_size<=y){
        mini=min(mini,BLOCKS[x/block_size]);
        x+=block_size;
    }
    while(x<=y){
        mini=min(mini,V[x]);
        x++;
    }
    return mini;
}

void solve(){
    build();
    for(int x,y,i=1;i<=qs;i++){
        in>>x>>y;
        out<<query(x,y)<<"\n";
    }
}
int main(){
    read();
    solve();
    return 0;
}