80pts代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int N=2e5+5;
int n;
long long a[N],c1[N],c2[N];
long long Read() {
long long x=0,flag=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-') {
flag=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=x*10+ch-'0';
ch=getchar();
}
return x*flag;
}
int lowbit(int x) {
return x&(-x);
}
void add(int k,long long x) {
long long X=k*x;
while (k<=n) {
c1[k]+=x,c2[k]+=X;
k+=lowbit(k);
}
}
long long getsum(long long *num,int k) {
long long sum=0;
while (k>0) {
sum+=num[k];
k-=lowbit(k);
}
return sum;
}
long long query(int l,int r) {
return (r+1)*getsum(c1,r)-l*getsum(c1,l-1)-(getsum(c2,r)-getsum(c2,l-1));
}
int main() {
int m;
n=Read();
m=Read();
for (int i=1;i<=n;i++) {
scanf("%d",&a[i]);
add(i,a[i]-a[i-1]);
}
long long l,r,x;
while (m--) {
int mode;
scanf("%d",&mode);
if (mode==1) {
l=Read(),r=Read(),x=Read();
add(l,x);
add(r+1,-x);
}else if (mode==2) {
x=Read();
add(1,x);
add(2,-x);
}else if (mode==3) {
x=Read();
add(1,-x);
add(2,x);
}else if (mode==4) {
l=Read(),r=Read();
printf("%lld\n",query(l,r));
}else if (mode==5) {
printf("%lld\n",query(1,1));
}
}
return 0;
}