bzoj1636: [Usaco2007 Jan]Balanced Lineup

来源:互联网 发布:徕卡ts02plus导出数据 编辑:程序博客网 时间:2024/05/24 02:16

线段树维护区间最大最小值。

#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));    }}
原创粉丝点击