求调,仅有50分(w257,T9 10)
查看原帖
求调,仅有50分(w257,T9 10)
1242018
aleavf楼主2025/8/5 10:51
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
const long long INF=1e18;
struct tree{
    long long l,r;
    long long sum,add,ake;
}q[N*4+10],b[N*4+10];
long long n,m;
long long a[N];
void pushdown(long long p){
    if(q[p].add){
        q[p*2].sum += (q[p*2].r-q[p*2].l+1)*q[p].add;
        q[p*2].add += q[p].add;
        q[p*2].ake += q[p].add;
        q[p*2+1].sum += (q[p*2+1].r-q[p*2+1].l+1)*q[p].add;
        q[p*2+1].add += q[p].add;
        q[p*2+1].ake += q[p].add;
        b[p*2].ake = max(b[p*2].ake, q[p*2].ake);
        b[p*2+1].ake = max(b[p*2+1].ake, q[p*2+1].ake);
        q[p].add=0;
    }
}
void build(long long p,long long l,long long r){
    q[p].l=l, q[p].r=r;
    b[p].l=l, b[p].r=r;
    if(l==r){
        q[p].sum=a[l];
        q[p].ake=a[l];
        b[p].ake=a[l];
        return;
    }
    long long mid=(l+r)/2;
    build(p*2,l,mid);
    build(p*2+1,mid+1,r);
    q[p].sum=q[p*2].sum+q[p*2+1].sum;
    q[p].ake=max(q[p*2].ake,q[p*2+1].ake);
    b[p].ake=max(b[p*2].ake,b[p*2+1].ake);
}
void change(long long p,long long x,long long y,long long z){
    if(x<=q[p].l && y>=q[p].r){
        q[p].sum += (q[p].r-q[p].l+1)*z;
        q[p].add += z;
        q[p].ake += z;
        b[p].ake = max(b[p].ake, q[p].ake);
        return;
    }
    pushdown(p);
    long long mid=(q[p].l+q[p].r)/2;
    if(x<=mid) change(p*2,x,y,z);
    if(y>mid) change(p*2+1,x,y,z);
    q[p].sum=q[p*2].sum+q[p*2+1].sum;
    q[p].ake=max(q[p*2].ake,q[p*2+1].ake);
    b[p].ake=max(b[p*2].ake,b[p*2+1].ake);
}
long long find(long long p,long long x,long long y){
    if(x<=q[p].l && y>=q[p].r) return q[p].sum;
    pushdown(p);
    long long ans=0;
    long long mid=(q[p].l+q[p].r)/2;
    if(x<=mid) ans+=find(p*2,x,y);
    if(y>mid) ans+=find(p*2+1,x,y);
    return ans;
}
void chan(long long p,long long x,long long y,long long z){
    if(q[p].ake<z) return;
    if(q[p].l==q[p].r){
        q[p].sum=min(q[p].sum,z);
        q[p].ake=q[p].sum;
        return;
    }
    pushdown(p);
    long long mid=(q[p].l+q[p].r)/2;
    if(x<=mid) chan(p*2,x,y,z);
    if(y>mid) chan(p*2+1,x,y,z);
    q[p].sum=q[p*2].sum+q[p*2+1].sum;
    q[p].ake=max(q[p*2].ake,q[p*2+1].ake);
}

long long ma_x(long long p,long long x,long long y){
    if(x<=q[p].l && y>=q[p].r) return q[p].ake;
    pushdown(p);
    long long ans=-INF;
    long long mid=(q[p].l+q[p].r)/2;
    if(x<=mid) ans=max(ans,ma_x(p*2,x,y));
    if(y>mid) ans=max(ans,ma_x(p*2+1,x,y));
    return ans;
}
long long ma_y(long long p,long long x,long long y){
    if(x<=b[p].l && y>=b[p].r) return b[p].ake;
    long long ans=-INF;
    long long mid=(b[p].l+b[p].r)/2;
    if(x<=mid) ans=max(ans,ma_y(p*2,x,y));
    if(y>mid) ans=max(ans,ma_y(p*2+1,x,y));
    return ans;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,1,n);
    while(m--){
        long long w,x,y,z;
        cin>>w;
        if(w==1){
            cin>>x>>y>>z;
            change(1,x,y,z);
        }
        else if(w==2){
            cin>>x>>y>>z;
            chan(1,x,y,z);
        }
        else if(w==3){
            cin>>x>>y;
            cout<<find(1,x,y)<<endl;
        }
        else if(w==4){
            cin>>x>>y;
            cout<<ma_x(1,x,y)<<endl;
        }
        else if(w==5){
            cin>>x>>y;
            cout<<ma_y(1,x,y)<<endl;
        }
    }
    return 0;
}
2025/8/5 10:51
加载中...