放在洛谷 IDE 上面运行提示超出内存限制,不知道哪里错了。
萌新初学线段树
#include <bits/stdc++.h>
using namespace std;
int s[100005], tree[400005], tag[400005];
int n, m;
int x, y, z;
void pushup(int cur) {
tree[cur] = tree[cur << 1] + tree[cur << 1 | 1];
return ;
}
void addtag(int cur, int left, int right, int var) {
tag[cur] += var;
tree[cur] += (right - left + 1) * var;
}
void pushdown(int cur, int left, int right) {
if (! tag[cur]) return ;
int mid = (left + right) >> 1;
addtag(cur << 1, left, mid, tag[cur]);
addtag(cur << 1 | 1, mid + 1, right, tag[cur]);
tag[cur] = 0;
}
void build(int cur, int left, int right) {
if (left == right) {
tree[cur] = s[left];
return ;
}
int mid = (left + right) >> 1;
build(cur << 1, left, mid);
build(cur << 1 | 1, mid + 1, right);
pushup(cur);
return ;
}
int query(int cur, int left, int right, int l, int r) {
if (left > r || right < l) return 0;
if (left >= l && right <= r) {
return tree[cur];
}
pushdown(cur, left, right);
int mid = (left + right) >> 1;
return query(cur << 1, left, mid, l, r) + query(cur << 1 | 1, mid + 1, right, l, r);
}
void update(int cur, int left, int right, int l, int r, int var) {
if (left > r || right < l) return ;
if (left >= l && right <= r) {
addtag(cur, left, right, var);
return ;
}
pushdown(cur, left, right);
int mid = (left + right) >> 1;
update(cur << 1, left, mid, l, r, var);
update(cur << 1 | 1, mid + 1, right, l, r, var);
pushup(cur);
}
signed main () {
cin >> n >> m;
for (int i = 1; i <= n; i ++) cin >> s[i];
build(1, 1, n);
while (m --) {
int q;
cin >> q;
if (q == 1) {
cin >> x >> y >> z;
update(1, 1, n, x, y, z);
} else {
cin >> x >> y;
cout << query(1, 1, n, x, y) << "\n";
}
}
return 0;
}