您的位置:首页 > 其它

POJ 3264 Balanced Lineup

2014-11-19 17:26 218 查看
线段树模板题,多次询问区间内最大值和最小值的差

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define maxn 50005
#define INF 1000005
struct node {
int l;
int r;
int Max;
int Min;

}tree[maxn*4];
int a[maxn];
int Maxv,Minv;
void build_tree(int pos,int left,int right){
tree[pos].l=left;
tree[pos].r=right;
if(left==right){
tree[pos].Max=a[left];
tree[pos].Min=a[left];
return;
}
int mid=(left+right)/2;
build_tree(pos*2,left,mid);
build_tree(pos*2+1,mid+1,right);
tree[pos].Max=max(tree[pos*2].Max,tree[pos*2+1].Max);
tree[pos].Min=min(tree[pos*2].Min,tree[pos*2+1].Min);
}
void query(int u,int left,int right){
if(tree[u].l==left&&tree[u].r==right){
Maxv=max(tree[u].Max,Maxv);
Minv=min(tree[u].Min,Minv);
return;
}
int mid=(tree[u].l+tree[u].r)/2;
if(mid>=right){
query(u*2,left,right);
}
else if(mid<left){
query(u*2+1,left,right);
}
else{
query(u*2,left,mid);
query(u*2+1,mid+1,right);
}
}
int main(){
int N,Q;
while(scanf("%d %d",&N,&Q)!=EOF){
for(int i=1;i<=N;i++){
scanf("%d",&a[i]);
}
build_tree(1,1,N);
int a,b;
for(int i=1;i<=Q;i++){
Maxv=-INF;
Minv=INF;
scanf("%d %d",&a,&b);
query(1,a,b);
printf("%d\n",Maxv-Minv);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: