*balanced lineup<pku 3264>

 
  
  // rmq<区间最指查询> , 不过不知道为什么跑起来忒慢...
1 // author : gssn
2 #include < iostream >
3 #include < cmath >
4 using namespace std;
5 int minn[ 50005 ][ 16 ],maxx[ 50005 ][ 16 ],f[ 50010 ];
6 int n,m;
7 void init()
8 {
9 int len = int (log(( double )n) / log( 2.0 ));
10 for ( int j = 1 ;j <= len;j ++ )
11 for ( int i = 1 ;i + ( 1 << (j - 1 )) - 1 <= n;i ++ )
12 {
13 maxx[i][j] = max(maxx[i][j - 1 ],maxx[i + ( 1 << (j - 1 ))][j - 1 ]);
14 minn[i][j] = min(minn[i][j - 1 ],minn[i + ( 1 << (j - 1 ))][j - 1 ]);
15 }
16 }
17 int query_( int a, int b)
18 {
19 int len = int (log(( double )(b - a + 1 )) / log( 2.0 )) ;
20 int x = max(maxx[a][len],maxx[b - ( 1 << len) + 1 ][len]);
21 int y = min(minn[a][len],minn[b - ( 1 << len) + 1 ][len]);
22 return x - y;
23 }
24 int main()
25 {
26 // int n,m;
27 int a,b;
28 cin >> n >> m;
29 for ( int i = 1 ;i <= n;i ++ )
30 {
31 cin >> f[i];
32 maxx[i][ 0 ] = f[i];
33 minn[i][ 0 ] = f[i];
34 }
35 init();
36 for ( int j = 0 ;j < m;j ++ )
37 {
38 cin >> a >> b;
39 cout << query_(a,b) << endl;
40 }
41 return 0 ;
42 }

转载于:https://www.cnblogs.com/eth0/archive/2011/05/17/2048769.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值