Pagini recente » Cod sursa (job #3247157) | Cod sursa (job #2651579) | Cod sursa (job #1369555) | Cod sursa (job #1838661) | Cod sursa (job #1069788)
#include <stdio.h>
#include <math.h>
const int inf = 1000000000;
using namespace std;
const int nmax = 103000;
int n,m,a[nmax],p[nmax],nr;
void create(){
int min=inf,nm=1,i=1;
while(i<=n){
if(min>a[i])min=a[i];
if(i%nr == 0 || i==n){
p[nm]=min;
nm++;
min=inf;
}
i++;
}
}
int minim(int x,int y){
int ic,sf,min=inf;
if(y-x<nr || (y-x==nr && (y%nr!=0) && 0)){
for(int i=x;i<=y;i++)if(min>a[i])min=a[i];return min;
}
//if(y-x==nr && (y%nr==0))return p[y/nr];
sf=y/nr;ic=x/nr+2;
if(((x-1)%nr==0 && x!=1) || x%nr==0)ic=x/nr+1;
for(int i=ic;i<=sf;i++)
if(min>p[i])min=p[i];
for(int i=x;i<=nr*ic-nr;i++) if(min>a[i])min=a[i];
for(int i=nr*sf+1;i<=y;i++) if(min>a[i])min=a[i];
return min;
}
int main(){
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%ld%ld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
nr=trunc(sqrt(n));
create();
//printf("%d\n",minim(3,5));
//for(int i=1;i<=n/nr+1;i++)printf("%d ",p[i]);
int x,y;
for(int i=1;i<=m;i++){
scanf("%d %d",&x,&y);
printf("%d\n",minim(x,y));
}
fclose(stdout); fclose(stdin);
return 0;
}