树状数组10分求助
查看原帖
树状数组10分求助
786844
wang126179楼主2023/1/5 09:07
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define M 1000010;
int n,q,h,a,b;
int ma[180005],mi[180005],aa[180005];
inline int lowbit(int i){
    return i&(-i);
}
void change(int i,int h){
    for(int j=i;j<=n;j+=lowbit(j)){
        ma[j]=max(ma[j],h);
        mi[j]=min(mi[j],h);
    }
}
int maxx(int a,int b){
    if(a==b) return aa[a];
    if(a<(b-lowbit(b))){
        return max(maxx(a,b-lowbit(b)),ma[b]);
    }else{
        return max(maxx(a,b-1),aa[b]);
    }
}
int minn(int a,int b){
    if(a==b) return aa[a];
    if(a<(b-lowbit(b))){
        return min(minn(a,b-lowbit(b)),mi[b]);
    }else{
        return min(minn(a,b-1),aa[b]);
    }
}
int main(){
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    cin>>n>>q;
    for(int i=0;i<n;i++){mi[i]=M;}
    for(int i=1;i<=n;i++){
        cin>>h;
        aa[i]=h;
        change(i,h);
    }
    for(int i=0;i<q;i++){
        cin>>a>>b;
        cout<<maxx(a,b)-minn(a,b)<<"\n";
    }
    return 0;
}
2023/1/5 09:07
加载中...