RMQ问题,即范围最小值问题(Range Minimum Query)
ST表
【任务】
给定一个数组A[n],设计一个数据结构,支持查询操作Query(L,R):计算min{AL,AL+1,...AR}或者max{AL,AL+1,...AR}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 #define MAX 180012 5 int A[MAX][17],B[MAX][17]; 6 7 int RMQ(int L,int R) 8 { 9 int k = 0; 10 while((1<<(k+1)) <= R-L+1) k++; 11 return (max(A[L][k],A[R-(1<<k)+1][k])-min(B[L][k],B[R-(1<<k)+1][k])); 12 } 13 int main() 14 { 15 //freopen("in.txt","r",stdin); 16 int i,j,m,n,a,b; 17 scanf("%d%d",&n,&m); 18 for(i=1; i<=n; i++) 19 { 20 scanf("%d",&a); 21 A[i][0] = B[i][0] = a; 22 } 23 for(j = 1; (1<<j) <= n; j++) 24 for(i = 1; i+j-1 <= n; i++) 25 { 26 B[i][j] = min( B[i][j-1], B[i+(1<<(j-1))][j-1] ); 27 A[i][j] = max( A[i][j-1], A[i+(1<<(j-1))][j-1] ); 28 } 29 while(m--) 30 { 31 scanf("%d%d",&a,&b); 32 printf("%d ",RMQ(a,b)); 33 } 34 return 0; 35 }