最近才学线段树,想用线段树解决树状数组区间修改单点查询的问题,但是不知道哪里出了问题, WA 0pts,请巨佬指教!
代码:
// Problem: #131. 树状数组 2 :区间修改,单点查询
// Contest: LibreOJ
// URL: https://loj.ac/p/131
// Memory Limit: 256 MB
// Time Limit: 3000 ms
#include <cctype>
#include <cstdio>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define int ll
const int MAXN = 1e6 + 10;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (!isdigit(ch)) {
if (ch == '-')
f = -1;
ch = getchar();
}
while (isdigit(ch)) {
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
namespace SegTree {
int tree[MAXN << 2], tag[MAXN << 2];
inline int lson(const int k) {
return k << 1;
}
inline int rson(const int k) {
return (k << 1) + 1;
}
inline void pushup(const int k) {
tree[k] = tree[lson(k)] + tree[rson(k)];
}
inline void pushdown(const int k, const int l, const int r) {
const int mid = l + ((r - l) >> 1);
tree[lson(k)] += tag[k] * (mid - l + 1);
tree[rson(k)] += tag[k] * (r - mid);
tag[lson(k)] += tag[k];
tag[rson(k)] += tag[k];
tag[k] = 0;
}
void build(int k, int l, int r) {
if (l == r) {
tree[k] = read();
return;
}
int mid = l + ((r - l) >> 1);
build(lson(k), l, mid);
build(rson(k), mid + 1, r);
pushup(k);
}
void update(int s, int t, int delta, int k, int l, int r) {
if (s <= l && r <= t) {
tree[k] += delta * (r - l + 1);
tag[k] += delta;
return;
}
if (!tag[k] && s != t)
pushdown(k, l, r);
int mid = l + ((r - l) >> 1);
if (s <= mid)
update(s, t, delta, lson(k), l, mid);
if (mid < t)
update(s, t, delta, rson(k), mid + 1, r);
pushup(k);
}
int query(int s, int t, int k, int l, int r) {
if (s <= l && r <= t)
return tree[k];
if (!tag[k])
pushdown(k, l, r);
int mid = l + ((r - l) >> 1), sum = 0;
if (s <= mid)
sum += query(s, t, lson(k), l, mid);
if (mid < t)
sum += query(s, t, rson(k), mid + 1, r);
return sum;
}
} // namespace SegTree
signed main(void) {
// Code here
int n = read(), q = read();
SegTree::build(1, 1, n);
while (q--) {
int op = read();
if (op == 1) {
int l = read(), r = read(), x = read();
SegTree::update(l, r, x, 1, 1, n);
} else {
int i = read();
printf("%lld\n", SegTree::query(i, i, 1, 1, n));
}
}
return 0;
}