1 /*******************************************************
 2 题目:     Balanced Lineup(poj 3264)
 3 链接:     http://poj.org/problem?id=3264
 4 题意:     给个数列,查询一段区间的最大值与最小值的差
 5 算法:     RMQ
 6 ********************************************************/
 7 #include<cstdio>
 8 #include<cstring>
 9 #include<algorithm>
10 #include<iostream>
11 #include<cmath>
12 using namespace std;
13 
14 const int mx=50010;
15 int dpmax[mx][20];
16 int dpmin[mx][20];
17 int a[mx];
18 int n,q;
19 
20 void makermq()
21 {
22     for (int i=1;i<=n;i++)
23     {
24         dpmax[i][0]=a[i];
25         dpmin[i][0]=a[i];
26     }
27     for (int j=1;(1<<j)<=n;j++)
28     {
29         for (int i=1;i+(1<<j)-1<=n;i++)
30         {
31             dpmax[i][j]=max(dpmax[i][j-1],dpmax[i+(1<<(j-1))][j-1]);
32             dpmin[i][j]=min(dpmin[i][j-1],dpmin[i+(1<<(j-1))][j-1]);
33         }
34     }
35 
36 }
37 
38 int rmq(int u,int v)
39 {
40     int k=(int)(log(v-u+1)/log(2.0));
41     return max(dpmax[u][k],dpmax[v-(1<<k)+1][k])-min(dpmin[u][k],dpmin[v-(1<<k)+1][k]);
42 }
43 
44 int main()
45 {
46     scanf("%d%d",&n,&q);
47     for (int i=1;i<=n;i++) scanf("%d",&a[i]);
48     makermq();
49     while (q--)
50     {
51         int u,v;
52         scanf("%d%d",&u,&v);
53         printf("%d\n",rmq(u,v));
54     }
55 }

 

posted on 2016-08-03 16:53  pb2016  阅读(188)  评论(0编辑  收藏  举报