poj3264,Balanced Lineup,线段树

来源:互联网 发布:魁北克大学知乎 编辑:程序博客网 时间:2024/05/22 16:37

简单的线段树

#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define N 50100#define ls (p<<1)#define rs (p<<1|1)#define mid(p) (t[p].l+t[p].r>>1)int v[N];struct segmentTree{    int l,r,mi,ma;}t[N*4];void build(int l,int r,int p){    t[p].l=l;t[p].r=r;    if (t[p].l==t[p].r){        t[p].mi=t[p].ma=v[l];        return;    }    int m=mid(p);    build(l,m,ls);    build(m+1,r,rs);    t[p].mi=min(t[ls].mi,t[rs].mi);    t[p].ma=max(t[ls].ma,t[rs].ma);}int query(int l,int r,int p,int func){    if (l==t[p].l&&r==t[p].r){        if (!func) return t[p].mi;        else return t[p].ma;    }    int m=mid(p);    if (r<=m) {        return query(l,r,ls,func);    }    else if (l>m){        return query(l,r,rs,func);    }    else {        int t1=query(l,m,ls,func);        int t2=query(m+1,r,rs,func);        if (!func) return min(t1,t2);        else return max(t1,t2);    }}int main(){    int i;    int n,m,a,b,mi,ma;    while(scanf("%d%d",&n,&m)!=EOF){        for(i=1;i<=n;++i){            scanf("%d",&v[i]);        }        build(1,n,1);        for(i=1;i<=m;++i){            scanf("%d%d",&a,&b);            mi=query(a,b,1,0);            ma=query(a,b,1,1);            printf("%d\n",ma-mi);        }    }    return 0;}


0 0
原创粉丝点击