poj-3264-Balanced Lineup-线段树-区域查询

来源:互联网 发布:路由器对网络稳定性 编辑:程序博客网 时间:2024/06/06 00:55

区域查询操作。

ma[i]:i区间内的最大值

mi[i]:i区间内的最小值

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<math.h>using namespace std;#define INF 99999999#define lmin 1#define rmax n#define lson l,(l+r)/2,rt<<1#define rson (l+r)/2+1,r,rt<<1|1#define root lmin,rmax,1#define maxn 55000int cl[maxn*4];int ma[maxn*4];int mi[maxn*4];int num[maxn];void push_up(int rt){    ma[rt]=max(ma[rt<<1],ma[rt<<1|1]);    mi[rt]=min(mi[rt<<1],mi[rt<<1|1]);}void push_down(int rt){    if(cl[rt]!=-1)    {        cl[rt<<1]=cl[rt];        cl[rt<<1|1]=cl[rt];        cl[rt]=-1;    }}void creat(int l,int r,int rt){    if(l==r)    {        scanf("%d",&cl[rt]);        ma[rt]=mi[rt]=cl[rt];        return;    }    creat(lson);    creat(rson);    push_up(rt);}void update(int ll,int rr,int x,int l,int r,int rt){    if(l>rr||r<ll)return;    if(ll<=l&&rr>=r)    {        cl[rt]+=x;        return;    }    // push_down(rt);    update(ll,rr,x,lson);    update(ll,rr,x,rson);    push_up(rt);}int query(int ll,int rr,int l,int r,int rt){    if(r<ll)return 0;    if(l>rr)return 0;    if(ll<=l&&rr>=r)return ma[rt];    return max(query(ll,rr,lson),query(ll,rr,rson));}int query1(int ll,int rr,int l,int r,int rt){    if(r<ll)return INF;    if(l>rr)return INF;    if(ll<=l&&rr>=r)return mi[rt];    return min(query1(ll,rr,lson),query1(ll,rr,rson));}int main(){    int T,_,n,l,r,st,x,m;    char str[110];    while(~scanf("%d%d",&n,&m))    {        creat(root);        while(m--)        {            scanf("%d%d",&l,&r);            printf("%d\n",query(l,r,root)-query1(l,r,root));        }    }    return 0;}


0 0
原创粉丝点击