您的位置:首页 > 其它

bzoj1636: [Usaco2007 Jan]Balanced Lineup

2017-07-05 19:19 351 查看
线段树维护区间最大最小值。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int mi(int x,int y)
{
return x<y?x:y;
}
int ma(int x,int y)
{
return x>y?x:y;
}
int n,a[50005],tot=1;
struct segtree
{
int ls;
int rs;
int maxx;
int minn;
}tree[100005];
void build(int p,int l,int r)
{
int mid=l+r>>1;
if(l==r)
{
tree[p].minn=tree[p].maxx=a[mid];
return;
}
tree[p].ls=++tot;
tree[p].rs=++tot;
build(tree[p].ls,l,mid);
build(tree[p].rs,mid+1,r);
tree[p].minn=mi(tree[tree[p].ls].minn,tree[tree[p].rs].minn);
tree[p].maxx=ma(tree[tree[p].ls].maxx,tree[tree[p].rs].maxx);
}
int qmax(int p,int x,int y,int l,int r)
{
int mid=l+r>>1;
if(x==l&&r==y)
return tree[p].maxx;
if(y<=mid)
return qmax(tree[p].ls,x,y,l,mid);
if(x>mid)
return qmax(tree[p].rs,x,y,mid+1,r);
return ma(qmax(tree[p].ls,x,mid,l,mid),qmax(tree[p].rs,mid+1,y,mid+1,r));
}
int qmin(int p,int x,int y,int l,int r)
{
int mid=l+r>>1;
if(x==l&&r==y)
return tree[p].minn;
if(y<=mid)
return qmin(tree[p].ls,x,y,l,mid);
if(x>mid)
return qmin(tree[p].rs,x,y,mid+1,r);
return mi(qmin(tree[p].ls,x,mid,l,mid),qmin(tree[p].rs,mid+1,y,mid+1,r));
}
int main()
{
int T,x,y;
scanf("%d%d",&n,&T);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
build(1,1,n);
while(T--)
{
scanf("%d%d",&x,&y);
printf("%d\n",qmax(1,x,y,1,n)-qmin(1,x,y,1,n));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: