poj3264

来源:互联网 发布:淘宝永恒强袭自由高达 编辑:程序博客网 时间:2024/05/22 01:29

链接:点击打开链接

题意:输出序列中区间最大值和最小值的差

代码:

#include <queue>#include <vector>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;const int SIZE=200005;const int INF=0x3f3f3f3f;int ans_max,ans_min;int maxx[SIZE<<2],minx[SIZE<<2];void build(int l,int r,int rt){    int m;    if(l==r){        scanf("%d",&maxx[rt]);        minx[rt]=maxx[rt];        return;    }                                           //建两颗树,一颗维护最大值,一颗维护最小值    m=(l+r)>>1;    build(l,m,rt<<1);    build(m+1,r,rt<<1|1);    maxx[rt]=max(maxx[rt<<1],maxx[rt<<1|1]);    minx[rt]=min(minx[rt<<1],minx[rt<<1|1]);}int query_max(int L,int R,int l,int r,int rt){    int m;    if(L<=l&&r<=R)    return maxx[rt];    m=(l+r)>>1;    if(L<=m)    ans_max=max(ans_max,query_max(L,R,l,m,rt<<1));    if(R>m)    ans_max=max(ans_max,query_max(L,R,m+1,r,rt<<1|1));    return ans_max;}int query_min(int L,int R,int l,int r,int rt){    int m;    if(L<=l&&r<=R)    return minx[rt];    m=(l+r)>>1;    if(L<=m)    ans_min=min(ans_min,query_min(L,R,l,m,rt<<1));    if(R>m)    ans_min=min(ans_min,query_min(L,R,m+1,r,rt<<1|1));    return ans_min;}                                               //线段树模板int main(){    int n,m,a,b;    while(scanf("%d%d",&n,&m)!=EOF){        build(1,n,1);        while(m--){            ans_max=-1*INF,ans_min=INF;            scanf("%d%d",&a,&b);            printf("%d\n",query_max(a,b,1,n,1)-query_min(a,b,1,n,1));        }    }    return 0;}


 

0 0
原创粉丝点击