Pagini recente » Cod sursa (job #2067200) | Cod sursa (job #2764378) | Cod sursa (job #234624) | Cod sursa (job #2351694) | Cod sursa (job #3253804)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
#define min(a,b) (a<b?a:b)
int *aint,s,n;
void update(int ind,int val){
ind=ind+s-1;
aint[ind]=val;
ind/=2;
do{
aint[ind]=min(aint[ind<<1],aint[(ind<<1)+1]);
ind=(ind>>1);
}while(ind>0);
};
void swap(int *a,int *b){
int t=*a;
*a=*b;
*b=t;
};
int rasp(int a,int b){
a=a+s-1;
b=b+s-1;
int r=INT_MAX;
if(a>=b) swap(&a,&b);
while(a<b){
if((a&1)==1){
r=min(r,aint[a]);
a++;
};
a=a>>1;
if((b&1)==0){
r=min(r,aint[b]);
b--;
};
b=b>>1;
};
r=min(aint[a],r);
return r;
};
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
int m,a,b,v;
scanf("%d%d",&n,&m);
double l=(double)(log2(n));
s=(int)pow(2,(int)(l)+(int)(!(l==(int)l)));
aint=(int *)calloc(s<<1,sizeof(int));
int p=s<<1;
for(int i=0;i<p;i++)
aint[i]=INT_MAX;
for(int i=0;i<n;i++)
scanf("%d",&v),update(i+1,v);
for(int i=0;i<m;i++){
scanf("%d%d",&a,&b);
printf("%d\n",rasp(a,b));
};
return 0;
}