Pagini recente » Cod sursa (job #295588) | Cod sursa (job #2389606) | Cod sursa (job #1439288) | Cod sursa (job #638410) | Cod sursa (job #2284037)
#include<stdio.h>
#include<iostream>
#include<fstream>
using namespace std;
typedef struct node{
int a, b;
int minim;
}node;
#define MAXN 100000
#define MAXV 100000
int M,N;
int V[MAXN];
node A[262141];
#define minim(x,y) x<y?x:y
void buildtree(int root, int l,int r){
if(l==r){
A[root].a=l;
A[root].b=l;
A[root].minim=V[l];
return;
}
int mid=(l+r)/2;
A[root].a=l;
A[root].b=r;
buildtree(2*root+1,l,mid);
buildtree(2*root+2,mid+1,r);
A[root].minim=minim(A[2*root+1].minim,A[2*root+2].minim);
}
int a,b;
int findmin(int root){
if(a<=A[root].a && b>=A[root].b)
return A[root].minim;
int mid=(A[root].a+A[root].b)/2;
int min1=MAXV,min2=MAXV;
if(a<=mid)
min1=findmin(root*2+1);
if(b>mid)
min2=findmin(root*2+2);
return minim(min1,min2);
}
int main(){
freopen("rmq.in", "r", stdin);
//freopen("arbint_test5.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d %d", &N,&M);
for(int i=0;i<N;i++)
scanf("%d", &V[i]);
buildtree(0,0,N-1);
int x,y,min;
for(int i=0;i<M;i++){
scanf("%d %d",&x,&y);
a=x-1;
b=y-1;
min=findmin(0);
printf("%d\n",min);
}
return 0;
}