POJ

来源:互联网 发布:07版excel编程入门教程 编辑:程序博客网 时间:2024/05/19 06:47
#include<stdio.h>int a[200000];struct node{    int maxx,minn;}s[800000];int max(int a,int b){    if(a>b)        return a;    return b;}int min(int a,int b){    if(a<b)        return a;    return b;}void build(int id,int l,int r){    if(l==r){        s[id].maxx=a[l];        s[id].minn=a[l];//        printf("%d %d\n",id,s[id].minn);        return;    }    int mid=(l+r)>>1;    build(id*2,l,mid);    build(id*2+1,mid+1,r);    s[id].maxx=max(s[id*2].maxx,s[id*2+1].maxx);    s[id].minn=min(s[id*2].minn,s[id*2+1].minn);}int QueryMax(int id,int ll,int rr,int l,int r){    if(l<=ll&&rr<=r){ //       printf("%d %d %d %d\n",id,s[id].maxx,ll,rr);        return s[id].maxx;    }    int mid=(ll+rr)>>1;    if(r<=mid)        return QueryMax(id*2,ll,mid,l,r);    else if(l>mid)        return QueryMax(id*2+1,mid+1,rr,l,r);    else        return max(QueryMax(id*2,ll,mid,l,r),QueryMax(id*2+1,mid+1,rr,l,r));}int QueryMin(int id,int ll,int rr,int l,int r){    if(l<=ll&&rr<=r){        return s[id].minn;    }    int mid=(ll+rr)>>1;    if(r<=mid)        return QueryMin(id*2,ll,mid,l,r);    else if(l>mid)        return QueryMin(id*2+1,mid+1,rr,l,r);    else        return min(QueryMin(id*2,ll,mid,l,r),QueryMin(id*2+1,mid+1,rr,l,r));}int main(){    int n,m;    while(~scanf("%d%d",&n,&m)){        for(int i=1;i<=n;i++)            scanf("%d",a+i);        build(1,1,n);        while(m--){            int l,r;            scanf("%d%d",&l,&r);            printf("%d\n",QueryMax(1,1,n,l,r)-QueryMin(1,1,n,l,r));        }        return 0;    }}

原创粉丝点击