线段树求最大值和最小值(2020.7.3)

线段树求最大值和最小值

#include<iostream>
#include<cstdio>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long ll;
const int maxn = 50000+100;
const int inf = 0x3f3f3f3f;
int maxs[maxn<<2];
int minn[maxn<<2];
int n,m;
void build(int l,int r,int rt){
    if(l==r){
        int num;
        scanf("%d",&num);
        maxs[rt]=num;
        minn[rt] = num;
        return;
    }
 
    int m = (l+r)>>1;
    build(lson);
    build(rson);
    maxs[rt]=max(maxs[rt<<1],maxs[rt<<1|1]);
    minn[rt]=min(minn[rt<<1],minn[rt<<1|1]);
 
}
int ma=0;
int mi = inf;
void query(int L,int R,int l,int r,int rt){
    if(L<=l&&r<=R){
        if(maxs[rt]>ma){
            ma = maxs[rt];
        }
        if(minn[rt]<mi){
            mi = minn[rt];
        }
        return;
    }
    int m = (l+r)>>1;
    if(L<=m)query(L,R,lson);
    if(R>m)query(L,R,rson);
}
int main(){
    scanf("%d%d",&n,&m);
    build(1,n,1);
    for(int i =0;i<m;++i){
        int x,y;
        scanf("%d%d",&x,&y);
        ma = 0;
        mi = inf;
        query(x,y,1,n,1);
        printf("%d\n",ma-mi);
    }
}

 

posted @ 2020-07-03 20:58  莫得感情的约德尔人  阅读(178)  评论(0)    收藏  举报