神奇地输出了17
感觉是 ans 数组在修改时出错了...或者思路有点问题
#include <bits/stdc++.h>
using namespace std;
int a[100005], c[100005], ans[1000005], n, m, tag[1000005];
int ls(int x) {
return x << 1;
}
int rs(int x) {
return x << 1|1;
}
void push_up(int x) {
ans[x] += ans[ls(x)] + ans[rs(x)];
}
void build(int p, int l, int r) {
int mid = (l + r) >> 1;
if(l == r) {
ans[p] = c[l];
return;
}
build(ls(p), l, mid);
build(rs(p), mid + 1, r);
push_up(p);
}
void f(int p, int l, int r, int k) {
ans[p] += (r - l + 1) * k;
tag[p] += k;
}
void push_down(int p, int l, int r) {
int mid = (l + r) >> 1;
f(ls(p), l, mid, tag[p]);
f(rs(p), mid + 1, r, tag[p]);
tag[p] = 0;
}
void update(int p, int l, int r, int nl, int nr, int k) {
if(nl <= l && r <= nr) {
ans[p] += k * (r - l + 1);
tag[p] += k;
return;
}
int mid = (l + r) >> 1;
push_down(p, l, r);
if(nl <= mid) update(ls(p), l, mid, nl, nr, k);
if(nr > mid) update(rs(p), mid + 1, r, nl, nr, k);
push_up(p);
}
int query(int p, int l, int r, int nl, int nr) {
int res = 0;
if(nl <= l && r <= nr) {
return ans[p];
}
int mid = (l + r) >> 1;
push_down(p, l, r);
if(nl <= mid) res += query(ls(p), l, mid, nl, nr);
if(nr > mid) res += query(rs(p), mid + 1, r, nl, nr);
return res;
}
int main() {
scanf("%d%d", &n, &m);
for(int i = 1;i <= n;i++) {
scanf("%d", &a[i]);
c[i] = a[i] - a[i - 1];
}
build(1, 1, n);
for(int i = 1;i <= m;i++) {
int op, x, y, z, k;
scanf("%d", &op);
if(op == 1) {
scanf("%d%d%d%d", &x, &y, &z, &k);
for(int j = 1;j <= 2 * n;j++) cout << ans[j] << " ";
cout << endl;
update(1, 1, n, x, x, z);
update(1, 1, n, x + 1, y, k);
update(1, 1, n, y + 1, y + 1, -k - (y - x) * z);
for(int j = 1;j <= 2 * n;j++) cout << ans[j] << " ";
cout << endl;
}
else {
scanf("%d", &x);
printf("%d\n", query(1, 1, n, 1, x));
}
}
}