Description
有n头牛排成一个数列,给q个询问,每个询问给定l和r,求[l,r]区间内最高的牛和最低的牛的身高差。
Sample Input
6 3
1
7
3
4
2
5
1 5
4 6
2 2
Sample Output
6
3
0
题解:
下午依然很水……
RMQ问题,这次用st表来解决,直接上板子就好,最大最小各求一下,相减即得。
1 #include<iostream> 2 #include<cmath> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 const int maxn=50009; 7 int st_max[maxn][20],st_min[maxn][20]; 8 int n,q,a[maxn],l,r; 9 void init_st() 10 { 11 for(int i=n;i>=1;i--) 12 { 13 st_max[i][0]=a[i]; 14 st_min[i][0]=a[i]; 15 for(int j=1;(i+(1<<j)-1)<=n;j++) 16 { 17 st_max[i][j]=max(st_max[i][j-1],st_max[i+(1<<j-1)][j-1]); 18 st_min[i][j]=min(st_min[i][j-1],st_min[i+(1<<j-1)][j-1]); 19 } 20 } 21 } 22 int ask_max(int l,int r) 23 { 24 int k=(int)(log(r-l+1.0)/log(2.0)); 25 return max(st_max[l][k],st_max[r-(1<<k)+1][k]); 26 } 27 int ask_min(int l,int r) 28 { 29 int k=(int)(log(r-l+1.0)/log(2.0)); 30 return min(st_min[l][k],st_min[r-(1<<k)+1][k]); 31 } 32 int main() 33 { 34 while(scanf("%d%d",&n,&q)!=EOF) 35 { 36 for(int i=1;i<=n;i++) 37 scanf("%d",&a[i]); 38 init_st(); 39 for(int i=1;i<=q;i++) 40 { 41 scanf("%d%d",&l,&r); 42 int ans=ask_max(l,r)-ask_min(l,r); 43 printf("%d\n",ans); 44 } 45 } 46 return 0; 47 }