rt,这是我的代码,通过了测试
#include<iostream>
#include<stack>
#include<string.h>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<climits>
#include<cstdio>
#include<vector>
#include<sstream>
#include<ctype.h>
#include<set>
#include<map>
#include<ctime>
#include<stdlib.h>
#include<queue>
#include<bitset>
#define usi unsigned int
#define ull unsigned long long
using namespace std;
template<typename TTT>inline void mr(TTT& theNumberToRead)
{
theNumberToRead = 0;
bool prn = false;
char c = getchar();
while (!isdigit(c))
{
if (c == '-')prn = true;
c = getchar();
}
while (isdigit(c))
theNumberToRead = 10 * theNumberToRead + (c ^ 48), c = getchar();
if (prn)
theNumberToRead = -theNumberToRead;
}
template<typename TTT>inline TTT mrr()
{
TTT theNumberToRead = 0;
bool prn = false;
char c = getchar();
while (!isdigit(c))
{
if (c == '-')prn = true;
c = getchar();
}
while (isdigit(c))
theNumberToRead = 10 * theNumberToRead + (c ^ 48), c = getchar();
return prn ? -theNumberToRead : theNumberToRead;
}
template<typename T>void my_write(T x)
{
if (x)
my_write(x / 10),
putchar(x % 10 ^ 48);
}
template<typename T>void mw(T x, char mid)
{
if (x)
{
if (x < 0)
putchar('-'),
x = -x;
my_write(x);
}
else putchar(48);
if (mid)
putchar(mid);
}
// ******************************************华丽的分割线******************************************
// ******************************************华丽的分割线******************************************
// ******************************************华丽的分割线******************************************
// ******************************************华丽的分割线******************************************
// ******************************************华丽的分割线******************************************
#define int long long
struct xzz
{
int ans = 0, tag = 0;
}dat[1 << 18];
int n2 = 1;
inline int ls(int x)
{
return x << 1;
}
inline int rs(int x)
{
return x << 1 | 1;
}
inline void up(int x)
{
dat[x].ans = dat[ls(x)].ans + dat[rs(x)].ans;
}
void build(int n)
{
while (n2 < n)
n2 <<= 1;
for (int i = n2; i < n2 + n; ++i)
mr(dat[i].ans);
for (int i = n2 - 1; i; --i)
up(i);
}
void update(int a, int b, int k, int p, int l, int r)
{
if (b<l || a>r)
return;
if (a <= l && r <= b)
dat[k].tag += p, dat[k].ans += (r - l + 1) * p;
else
{
update(a, b, ls(k), p, l, l + r >> 1);
update(a, b, rs(k), p, (l + r >> 1) + 1, r);
up(k);
dat[k].ans += dat[k].tag * (r - l + 1);
}
}
int query(int a, int b, int k, int l, int r)
{
if (b<l || a>r)
return 0;
if (a <= l && r <= b)
return dat[k].ans;
return query(a, b, ls(k), l, l + r >> 1) + query(a, b, rs(k), (l + r >> 1) + 1, r) +
dat[k].tag * (min(b, r) - max(a, l) + 1);
}
signed main()
{
int n, m;
mr(n), mr(m);
build(n);
while (m--)
{
int o, x, y, k;
mr(o), mr(x), mr(y);
if (o == 1)
{
mr(k);
update(x, y, 1, k, 1, n2);
}
else
mw(query(x, y, 1, 1, n2), '\n');
}
return 0;
}