树状数组求区间最大小值

const int N=5e5+5;
const int INF=0x3f3f3f3f;
int n,q;
int a[N],trmx[N],trmn[N];
//将原来的累加改为求最值
void add(int x,int k){
    while(x<=n){
        trmx[x]=max(trmx[x],k);
        trmn[x]=min(trmn[x],k);
        x+=lowbit(x);
    }
}
//区间查询最大/小值
int fimx(int x,int y){
    if(y>x){
        if(y-lowbit(y)>x){
            return max(trmx[y],fimx(x,y-lowbit(y)));
        }
        else{
            return max(a[y],fimx(x,y-1));
        }
    }
    return a[x];
}

int fimn(int x,int y){
    if(y>x){
        if(y-lowbit(y)>x){
            return min(trmn[y],fimn(x,y-lowbit(y)));
        }
        else{
            return min(a[y],fimn(x,y-1));
        }
    }
    return a[x];
}

void solve(){
    memset(trmn,INF,sizeof trmn);//求最小值记得初始化INF
    cin>>n>>q;
	for(int i=1;i<=n;i++){
        cin>>a[i];
        add(i,a[i]);
    }

    while(q--){
        int l,r;cin>>l>>r;
        cout<<fimx(l,r)-fimn(l,r)<<endl;
    }
}

posted on   TaopiTTT  阅读(24)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示