Pagini recente » Cod sursa (job #3129011) | Cod sursa (job #2680335) | Cod sursa (job #2660200) | Cod sursa (job #1876939) | Cod sursa (job #1965906)
#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;
}