题目链接:http://hihocoder.com/problemset/problem/1080
#include<bits/stdc++.h>
using namespace std;
#define rep(i, s, t) for(int (i)=(s);(i)<=(t);++(i))
#define urep(i, s, t) for(int (i)=(s);(i)>=(t);--(i))
typedef long long LL;
const int Maxn = 100005;
int N, m;
const int Maxnode = Maxn<<2;
//#define lson(x) ((x)<<1)
//#define rson(x) (((x)<<1)|1)
#define lc o<<1
#define rc o<<1|1
LL sumv[Maxnode], setv[Maxnode], addv[Maxnode];
int n, qL, qR, qSum;
void segBuild(int o, int L, int R) {
addv[o] = 0;
setv[o] = 0;
if (L == R) {
scanf("%lld", &sumv[o]);
}
else {
int m = (L+R)>>1;
segBuild(lc, L, m);
segBuild(rc, m+1, R);
sumv[o] = sumv[lc] + sumv[rc];
}
}
void segDown(int o, int L, int R) {
int m = (L+R)>>1;
if (setv[o]) {
setv[lc] = setv[rc] = setv[o];
addv[lc] = addv[rc] = 0;
sumv[lc] = (m-L+1)*setv[o];
sumv[rc] = (R-m)*setv[o];
setv[o] = 0;
}
if (addv[o]) {
addv[lc] += addv[o];
addv[rc] += addv[o];
sumv[lc] += (m-L+1)*addv[o];
sumv[rc] += (R-m)*addv[o];
addv[o] = 0;
}
}
void segUp(int o) {
sumv[o] = sumv[lc] + sumv[rc];
}
void segUpdate(int o, int L, int R, int v, int type) {
if (qL <= L && R <= qR) {
if (type == 0) {
addv[o] += v;
sumv[o] += (R-L+1)*v;
} else {
setv[o] = v;
addv[o] = 0;
sumv[o] = (R-L+1)*v;
}
} else {
segDown(o, L, R);
int m = (L+R)>>1;
if (qL <= m)
segUpdate(lc, L, m, v, type);
if (qR > m)
segUpdate(rc, m+1, R, v, type);
segUp(o);
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.in", "r", stdin);
#endif
scanf("%d%d",&n, &m);
int type, l, r, v;
++n;
segBuild(1, 1, n);
while (m--) {
scanf("%d%d%d%d",&type, &l, &r, &v);
qL = l+1;
qR = r+1;
segUpdate(1, 1, n, v, type);
printf("%lld\n", sumv[1]);
}
return 0;
}