基本思路:
- 最小值st表.
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> using namespace std; const int MAXN=3e5; int a[MAXN],f[MAXN][25]; int m; void init(){ memset(f,0x3f,sizeof(f)); for(int i=1;i<=m;i++) f[i][0]=a[i]; for(int j=1;j<=18;j++) for(int i=1;i<=m;i++){ f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]); } } int query(int l,int r){ int k=log2(r-l+1); return min(f[l][k],f[r-(1<<k)+1][k]); } int main(){ int n; scanf("%d%d",&m,&n); for(int i=1;i<=m;i++){ scanf("%d",&a[i]); } init(); for(int i=1;i<=n;i++){ int l,r; scanf("%d%d",&l,&r); printf("%d ",query(l,r)); } printf("\n"); return 0; }