這是一個區間查詢最值的問題,用線段樹來作。node
建樹的時候,這裏不是求和,應該是e[k].w=min(e[k*2].w,e[k*2+1].w),因此這裏要注意如下,其次是查詢的時候,由於本題不用讓咱們修改,因此咱們不須要懶標記,而後咱們再去區間查詢最大值c++
1.不要忘了寫build()ui
2.練好看範圍的能力spa
代碼code
#include<bits/stdc++.h> #define maxn 100005 #define maxm 100005 #define INF 9999999 using namespace std; int n,m; int a,b; struct node{ int l,r; int f,w; }e[maxn]; int s[maxn],ans[maxn]; int minn; inline void build(int ll,int rr,int k){ e[k].l=ll,e[k].r =rr; if(ll==rr){ e[k].w=s[ll]; return; } int m=(e[k].l+e[k].r)/2; build(ll,m,k*2); build(m+1,rr,k*2+1); e[k].w=min(e[k*2].w,e[k*2+1].w); } inline void query(int k){ if(e[k].l<=a&&e[k].r>=b){ return e[k].w; } int m=(e[k].l+e[k].r)/2; if(a<=m) minn=min(minn,query(k*2)); if(b>m) minn=min(minn,query(k*2+1)); return minn; } int main(){ cin>>n; cin>>m; for(int i=1;i<=n;i++){ cin>>s[i]; } build(1,n,1); for(int i=1;i<=m;i++){ cin>>a>>b; minn=INF; minn=query(1); ans[i]=minn; } for(int i=1;i<=m;i++){ cout<<ans[i]<<" "; } return 0; }