【程序代碼】
#include<bits/stdc++.h>
using namespace std;
const int maxn=100001;
int n,m,L,R,a[maxn],segMin[maxn*4];//線段樹數組要開大4倍
void build(int cur,int L,int R) {//cur表示區間[L,R]的標號
if(L==R) segMin[cur]=a[L];
else {
int mid=(L+R)/2;
build(cur*2,L,mid);
build(cur*2+1,mid+1,R);
segMin[cur]=min(segMin[cur*2],segMin[cur*2+1]);
}
}
int get_min(int cur,int L,int R,int x,int y) { //查詢區間[x,y]的最小值
if(x>R||y<L) return 0x3f3f3f3f; //求最小值,此時設置返回正無窮大
if(x<=L&&y>=R) return segMin[cur];
int mid=(L+R)/2;
return min(get_min(cur*2,L,mid,x,y),get_min(cur*2+1,mid+1,R,x,y));
}
int main() {
cin>>n>>m;
for(int i=1; i<=n; i++) cin>>a[i];
build(1,1,n);
while(m--) {
cin>>L>>R;
cout<<get_min(1,1,n,L,R)<<endl;
}
}
/*
in:
10 3
9 12 51 27 99 3 21 28 16 67
1 3
3 9
7 10
out:
9
3
16
*/