RT,开了long long还是见了祖宗
#include<iostream>
#include<cstdio>
using namespace std;
inline long long readin()
{
long long x = 0;
char c = getchar();
while(c < '0' || c > '9')
c = getchar();
while(c >= '0' && c <= '9')
{
x = (x << 3) + (x << 1) + c - '0';
c = getchar();
}
return x;
}
long long sum[800001], tag[800001], a[200001], n, m, op, aa, bb, cc;
void pushup(int index)
{
sum[index] = sum[index * 2] + sum[index * 2 + 1];
}
void build(int l, int r, int index)
{
if(l == r)
{
sum[index] = a[l];
return;
}
int m = (l + r) / 2;
build(l, m, index * 2);
build(m + 1, r, index * 2 + 1);
pushup(index);
}
bool qb(int l1, int r1, int l2, int r2)
{
return l1 <= l2 && r1 >= r2;
}
bool noj(int l1, int r1, int l2, int r2)
{
return l1 > r2 || l2 > r1;
}
void tagging(int l, int r, int index, long long x)
{
tag[index] += x;
sum[index] += (r - l + 1) * x;
}
void pushdown(int l, int r, int index)
{
int m = (l + r) / 2;
tagging(l, m, index * 2, tag[index]);
tagging(m + 1, r, index * 2 + 1, tag[index]);
tag[index] = 0;
}
void xg(int L, int R, int l, int r, int index, long long x)
{
if(qb(L, R, l, r))
{
tagging(l, r, index, x);
return;
}
if(!noj(L, R, l, r))
{
pushdown(l, r, index);
int m = (l + r) / 2;
xg(L, R, l, m, index * 2, x);
xg(L, R, m + 1, r, index * 2 + 1, x);
pushup(index);
}
}
long long query(int L, int R, int l, int r, int index)
{
if(qb(L, R, l, r))
return sum[index];
if(noj(L, R, l, r))
return 0;
pushdown(l, r, index);
int m = (l + r) / 2;
return query(L, R, l, m, index * 2) + query(L, R, m + 1, r, index * 2 + 1);
}
void print(int index, int l, int r)
{
cout << index << ' ' << sum[index] << ' ' << tag[index] << endl;
if(l == r)
return;
int m = (l + r) / 2;
print(index * 2, l, m);
print(index * 2 + 1, m + 1, r);
}
int main()
{
n = readin();
m = readin();
for(int i = 1; i <= n; i++)
a[i] = readin();
build(1, n, 1);
for(int i = 1; i <= m; i++)
{
op = readin();
if(op == 1)
{
aa = readin();
bb = readin();
cc = readin();
xg(aa, bb, 1, n, 1, cc);
}
if(op == 2)
{
aa = readin();
xg(1, 1, 1, n, 1, aa);
}
if(op == 3)
{
aa = readin();
xg(1, 1, 1, n, 1, -aa);
}
if(op == 4)
{
aa = readin();
bb = readin();
printf("%d\n", query(aa, bb, 1, n, 1));
}
if(op == 5)
{
printf("%d\n", query(1, 1, 1, n, 1));
}
// print(1, 1, n);
}
return 0;
}