a

· · 个人记录

#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int block[N],a[N],add[N],ans;
int rw[N];
int n,c,l,r,f;
void Add(int l,int r,int c){
    for(int i=l;i<=min(r,block[l]*int(sqrt(n)));i++){
        rw[block[i]]-=a[i];
        a[i]+=c;
        rw[block[i]]+=a[i];
    }
    if(block[r]!=block[l]){
        for(int i=(block[r]-1)*int(sqrt(n))+1;i<=r;i++){
            rw[block[i]]-=a[i];
            a[i]+=c;
            rw[block[i]]+=a[i];
        }
    }
    for(int i=block[l]+1;i<=block[r]-1;i++){
        add[i]+=c;
        rw[i]+=c*int(sqrt(n));
    }
}
/*void add2(){
    a[1]+=c;
}
void eee(){
    a[1]-=c;
}*/
int query(int l,int r){
    ans=0;
    for(int i=l;i<min(r,block[l]*int(sqrt(n)));i++){
        ans+=a[i]+add[block[i]];
    }
    if(block[l]!=block[r]){
        for(int i=(block[r]-1)*int(sqrt(n))+1;i<=r;i++){
            ans+=a[i]+add[block[i]];
        }
    }
    for(int i=block[l]+1;i<block[r];i++){
        ans+=rw[i];
    }
    return ans;
}
int main(){
    scanf("%d%d",&n,&f);    
    int k=sqrt(n);
    for(int i=1;i<=n;i++) {
        scanf("%d",&a[i]);
        block[i]=(i-1)/k+1;
        rw[block[i]]+=a[i];
    }
    for(int i=1;i<=f;i++){
        int opt;
        cin>>opt;
        if(opt==1) cin>>l>>r>>c,Add(l,r,c);
        if(opt==2) cin>>c,Add(1,1,c);
        if(opt==3) cin>>c,Add(1,1,-1*c);
        if(opt==4) cin>>l>>r,cout<<query(l,r)<<endl;
        if(opt==5) cout<<a[1]+add[1]<<endl;
    }
    return 0;
}