poj3264

链接:点击打开链接

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

代码:

#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;
}


 

你可能感兴趣的:(poj3264)