您的位置:首页 > 其它

poj 3264 Balanced Lineup

2014-08-14 22:39 232 查看
求a b区间内最大值和最小值的差,是a b 区间内,用父节点存左右儿子的最大值和最小值,不能用父节点来存最大值和最小值之差 。自己画个图就会明白了

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define Rs rt<<1|1
#define Ls rt<<1
#define Rson m+1,r,rt<<1|1
#define Lson l,m,rt<<1
int const MAXN = 50010;
struct Tree{
int v;
int mi,ma;
}tree[MAXN<<3];
inline int Min(int a,int b){
return a<b?a:b;
}
inline int Max(int a,int b){
return a>b?a:b;
}
inline void PushUp(int rt){
tree[rt].ma = Max(tree[Rs].ma,tree[Ls].ma);
tree[rt].mi = Min(tree[Rs].mi,tree[Ls].mi);
}
void Build(int l,int r,int rt){
if(l == r){
scanf("%d",&tree[rt].v);
tree[rt].ma = tree[rt].mi = tree[rt].v;
return ;
}
int m = (l + r)>>1;
Build(Lson);
Build(Rson);
PushUp(rt);
}
void Query(int l,int r,int rt,int L,int R,int &s1,int &s2){
if(L <= l && r <= R){
s2 = Max(s2,tree[rt].ma);
s1 = Min(s1,tree[rt].mi);
return ;
}
int m = (l + r)>>1;
if(L <= m) Query(Lson,L,R,s1,s2);
if(R > m) Query(Rson,L,R,s1,s2);
}
int main(){
int n,q;
while(~scanf("%d%d",&n,&q)){
Build(1,n,1);
while(q--){
int a,b;
scanf("%d%d",&a,&b);
int s1 = 1000010,s2 = 0;
Query(1,n,1,a,b,s1,s2);
printf("%d\n",s2 - s1);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: