样例第三个过不去,找问题找的头晕..
#include<cstdio>
#define lson rt<<1
#define rson rt<<1|1
const int N=1e5+10;
int n, m;
long long seg[N<<2],tag[N<<2];
void build(int rt, int l, int r) {
if (l==r) {
scanf("%lld", &seg[rt]);
return;
}
int mid=(l+r)>>1;
build(lson,l,mid);
build(rson,mid+1,r);
seg[rt]=seg[lson]+seg[rson];
}
inline void f(int rt, int k, int l, int r) {
seg[rt]+=1LL*k*(r-l+1);
tag[rt]+=k;
}
inline void PushDown(int rt, int l, int r) {
if (tag[rt]==0) return; //卡,都能卡
int mid=(l+r)>>1;
f(lson,l,mid,tag[rt]);
f(rson,mid+1,r,tag[rt]);
tag[rt]=0;
}
void modify(int x, int y, int k, int rt, int l, int r) {
if (x<=l && r<=y) {
f(rt, k, l, r);
return;
}
PushDown(rt,l,r);
int mid=(l+r)>>1;
if (x<=mid) modify(x,y,k,lson,l,mid);
if (y>mid) modify(x,y,k,rson,mid+1,r);
seg[rt]=seg[lson]+seg[rson];
}
long long query(int x, int y, int rt, int l, int r) {
if (x<=l && r<=y) return seg[rt];
PushDown(rt,l,r);
int mid=(l+r)>>1;
long long ans = 0;
if (x<=mid) ans+=query(x,y,lson,l,mid);
if (y>mid) ans+=query(x,y,rson,mid+1,r);
return ans;
}
int main() {
int x, y, opt, k;
scanf("%d%d", &n, &m);
build(1,1,n);
while (m--) {
scanf("%d%d%d", &opt, &x, &y);
if (opt==1) {
scanf("%d", &k);
modify(x,y,k,1,1,n);
}
else printf("%lld\n", query(x,y,1,1,n));
}
}