a
yan_jun
·
·
个人记录
#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;
}