【模板】RMQ

POJ 3264

题目大意:求一段区间内最大值与最小值之差

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<cmath>
 6 #define maxn 50005
 7 using namespace std;
 8 int n,m,a[maxn];
 9 int ma[maxn][20],mi[maxn][20];
10 void pre()
11 {
12     for(int i=1;i<=n;i++) mi[i][0]=a[i],ma[i][0]=a[i];
13     for(int j=1;(1<<j)<=n;j++)
14     for(int i=1;i+(1<<j)-1<=n;i++)
15     mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]),
16     ma[i][j]=max(ma[i][j-1],ma[i+(1<<(j-1))][j-1]);
17 } 
18 int query(int l,int r)
19 {
20     int k=trunc(log2(r-l+1));
21     return (max(ma[l][k],ma[r-(1<<k)+1][k])-min((mi[l][k]),mi[r-(1<<k)+1][k]));
22 }
23 int main()
24 {
25     int l,r;
26     scanf("%d%d",&n,&m);
27     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
28     pre();
29     for(int i=1;i<=m;i++)
30     {
31         scanf("%d%d",&l,&r);
32         printf("%d\n",query(l,r));
33     }
34     return 0;
35 } 
View Code

以上 by dsb LQ_double

posted @ 2016-11-04 21:34  Native_carrot  阅读(328)  评论(0编辑  收藏  举报