[kuangbin带你飞]专题七 线段树 G POJ 3264

来源:互联网 发布:linux 使用ftp 编辑:程序博客网 时间:2024/05/21 00:47

求区间最大最小值差.

#include <cstdio>#include <algorithm>using namespace std;const int maxn=5e5+10;#define inf 0x3f3f3f3f#define lid (id<<1)#define rid  (id<<1|1)int a[maxn];struct node{   int l,r,Max,Min;}tr[maxn*4];void push_up(int id){    tr[id].Max=max(tr[lid].Max,tr[rid].Max);    tr[id].Min=min(tr[lid].Min,tr[rid].Min);}void build(int id,int l,int r){    tr[id].l=l,tr[id].r=r;    if(l==r) tr[id].Max=tr[id].Min=a[l];    else{        int mid=(l+r)>>1;        build(lid,l,mid);        build(rid,mid+1,r);        push_up(id);    }}int ans1,ans2;void query(int id,int l,int r){    if(l==tr[id].l &&r==tr[id].r)    ans1=max(ans1,tr[id].Max),ans2=min(ans2,tr[id].Min);    else{        int mid=(tr[id].l+tr[id].r)>>1;        if(r<=mid) query(lid,l,r);        else if(l>mid) query(rid,l,r);        else        {            query(lid,l,mid);            query(rid,mid+1,r);        }    }}int main(){    int n,q;    scanf("%d%d",&n,&q);    for(int i=1;i<=n;i++) scanf("%d",&a[i]);    build(1,1,n);    for(int i=1;i<=q;i++)    {        int x,y;        scanf("%d%d",&x,&y);        ans1=-1,ans2=inf;        query(1,x,y);    //   printf("%d %d\n",ans1,ans2);        printf("%d\n",ans1-ans2);    }}


原创粉丝点击