rt.一个区间修改区间查询的板子,状态是wa,似乎不是数据范围的问题,题目 n 为 105 级别,数据为 1018 级别。
#include <iostream>
using namespace std;
#define ll long long
const int MAXN = 4e5 + 10;
int t, n, m;
ll tr[MAXN], vis[MAXN];
int lc(int now) {
return now * 2;
}
int rc(int now) {
return now * 2 + 1;
}
void push_up(int now) {
tr[now] = tr[lc(now)] + tr[rc(now)];
}
void push_down(int now, int ln, int rn) {
ll e = vis[now];
if (vis[now]) {
vis[lc(now)] += e;
vis[rc(now)] += e;
tr[lc(now)] += e * ln;
tr[rc(now)] += e * rn;
vis[now] = 0;
}
}
void build(int now, int l, int r) {
if (l == r) {
cin >> tr[now];
return;
}
int mid = (l + r) >> 1;
build(lc(now), l, mid);
build(rc(now), mid + 1, r);
push_up(now);
}
ll query(int now, int l, int r, int L, int R) {
ll ans = 0;
if (L <= l && R >= r) {
return tr[now];
}
int mid = (l + r) >> 1;
push_down(now, mid - l + 1, r - mid);
if (L <= mid) {
ans += query(lc(now), l, mid, L, R);
}
if (R > mid) {
ans += query(rc(now), mid + 1, r, L, R);
}
return ans;
}
void update(int now, int l, int r, int L, int R, ll e) {
if (L > r || R < l) {
return;
}
if (L <= l && r <= R) {
tr[now] += e * (r - l + 1);
vis[now] = e;
return;
}
int mid = (l + r) >> 1;
push_down(now, mid - l + 1, r - mid);
if (L <= mid) {
update(lc(now), l, mid, L, R, e);
}
if (mid < R) {
update(rc(now), mid + 1, r, L, R, e);
}
push_up(now);
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> m;
build(1, 1, n);
for (int x, y, z; m--; ) {
char c;
cin >> c >> x >> y;
if (c == 'C') {
cin >> z;
update(1, 1, n, x, y, z);
} else {
cout << query(1, 1, n, x, y) << '\n';
}
}
return 0;
}