有点累了,调不动了
线段树永远的痛,最简单的一个都爆0
#include <bits/stdc++.h>
using namespace std;
#define srand srand(time(NULL))
#define random(x) rand() % (x)
#define il inline
#define ptc putchar
#define reg register
#define mp make_pair
typedef __int128 LL;
typedef long long ll;
typedef pair<int, int> PII;
namespace cyyh {
template <typename T>
il void read(T &x) {
x = 0; T f = 1; char ch;
while (!isdigit(ch = getchar())) f -= (ch == '-') << 1;
while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch & 15), ch = getchar(); x *= f;
}
template <typename T>
il void write(T x) {
if (x < 0) ptc('-'), x = -x;
if (x > 9) write(x / 10);
ptc(x % 10 + '0');
}
template <typename T>
il T lowbit(const T &x) {
return x & -x;
}
}
using namespace cyyh;
const int N = 2e5 + 5; // 2倍空间
int n, m, tag[N], s[N];
struct node {
int l, r;
} t[N];
void update(int l, int r, int id, int mid) { // mid用于更新儿子区间
if (!tag[id]) return ;
tag[id << 1] += tag[id];
tag[id << 1 | 1] += tag[id];
s[id << 1] += tag[id] * (mid - l + 1);
s[id << 1 | 1] += tag[id] * (r - mid);
tag[id] = 0;
}
int add(int l, int r, int x, int y, int k, int id) { // l,r表示现在递归到的区间,x,y表示题目中要加的区间
if (l > y || r < x) return 0;
if (l >= x && r <= y) { // 完全覆盖,直接加上标记和值
tag[id] += k;
s[id] += (r - l + 1) * k; // 注意是加上当前区间的和
return s[id];
}
int mid = l + r >> 1;
update(l, r, id, mid);
s[id] = add(l, mid, x, y, k, id << 1) + add(mid + 1, r, x, y, k, id << 1 | 1);
return s[id];
}
int get(int l, int r, int x, int y, int id) {
if (l > y || r < x) return 0;
if (l >= x && r <= y) return s[id];
int mid = l + r >> 1;
update(l, r, id, mid);
return get(l, mid, x, y, id << 1) + get(mid + 1, r, x, y, id << 1 | 1);
}
int main() {
read(n), read(m);
for (int i = 1; i <= n; ++i) {
int x;
read(x);
add(1, n, i, i, x, 1);
}
for (int i = 1; i <= m; ++i) {
int op, x, y, k;
read(op);
if (op == 1) {
read(x), read(y), read(k);
add(1, n, x, y, k, 1);
} else {
read(x), read(y);
write(get(1, n, x, y, 1)), ptc('\n');
}
}
return 0;
}
可能要去睡了,明天我回来看的QwQ