This documentation is automatically generated by competitive-verifier/competitive-verifier
#define PROBLEM "https://judge.yosupo.jp/problem/point_add_range_sum"
#include <bits/stdc++.h>
using namespace std;
#include "ds/segtree.hpp"
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n, q;
cin >> n >> q;
struct M {
using T = int64_t;
static inline constexpr T id() { return 0; }
static inline T op(T l, T r) { return l + r; }
};
SegTree<M> st(n, [](int x) { return cin >> x, x; });
while (q--) {
int t;
cin >> t;
if (t == 0) {
int p, x;
cin >> p >> x;
st[p] += x;
} else {
int l, r;
cin >> l >> r, cout << st(l, r) << "\n";
}
}
}
#line 1 "test/yosupo/ds/point_add_range_sum.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/point_add_range_sum"
#include <bits/stdc++.h>
using namespace std;
#line 2 "ds/segtree.hpp"
#line 2 "other/update_proxy.hpp"
// clang-format off
template<class T, class Cb> struct UpdateProxy {
T &x;
Cb cb;
UpdateProxy(T &_x, Cb _cb) : x(_x), cb(_cb) {}
operator const T &() const { return x; }
auto &operator*() && { return x; }
auto operator->() && { return &x; }
auto operator++(int) && { T old = x; return ++x, cb(), old; }
auto operator--(int) && { T old = x; return --x, cb(), old; }
auto &operator++() && { ++x, cb(); return *this; }
auto &operator--() && { --x, cb(); return *this; }
auto &operator+=(const T &r) && { x += r, cb(); return *this; }
auto &operator-=(const T &r) && { x -= r, cb(); return *this; }
auto &operator*=(const T &r) && { x *= r, cb(); return *this; }
auto &operator/=(const T &r) && { x /= r, cb(); return *this; }
auto &operator%=(const T &r) && { x %= r, cb(); return *this; }
auto &operator=(const T &r) && { x = r, cb(); return *this; }
auto &operator<<=(const T &r) && { x <<= r, cb(); return *this; }
auto &operator>>=(const T &r) && { x >>= r, cb(); return *this; }
template<class F> auto &apply(F &&f) && { f(x), cb(); return *this; }
};
// clang-format on
#line 4 "ds/segtree.hpp"
// Modified version of atcoder library's segtree.hpp
template<class M> struct SegTree {
using T = typename M::T;
int n, m;
vector<T> t;
SegTree() = default;
SegTree(int _n) : n(_n), m(bit_ceil(n)), t(2 * m, M::id()) {}
template<class G> SegTree(int _n, G &&gen) : SegTree(_n) {
for (int i = 0; i < n; i++) t[i + m] = gen(i);
for (int i = m; --i;) update(i);
}
template<class V>
SegTree(const V &v) :
SegTree((int)v.size(), [&](int i) { return T(v[i]); }) {}
vector<T> to_vec() {
vector<T> r(n);
for (int i = 0; i < n; i++) r[i] = t[i + m];
return r;
}
void set(int p, const T &x) {
assert(0 <= p && p < n);
t[p + m] = x, update_from(p);
}
void mul(int p, const T &x) {
assert(0 <= p && p < n);
t[p + m] = M::op(t[p + m], x), update_from(p);
}
auto operator[](int p) {
assert(0 <= p && p < n);
UpdateProxy up(t[p + m], [this, p]() { update_from(p); });
return up;
}
T operator[](int p) const {
assert(0 <= p && p < n);
return t[p + m];
}
T get(int p) const { return (*this)[p]; }
T operator()(int l, int r) const {
assert(0 <= l && l <= r && r <= n);
T resl = M::id(), resr = M::id();
for (l += m, r += m; l < r; l >>= 1, r >>= 1) {
if (l & 1) resl = M::op(resl, t[l++]);
if (r & 1) resr = M::op(t[--r], resr);
}
return M::op(resl, resr);
}
T pref(int r) const { return (*this)(0, r); }
T suff(int l) const { return (*this)(l, n); }
T prod(int l, int r) const { return (*this)(l, r); }
T all_prod() const { return t[1]; }
template<class G> int max_right(int l, G &&g) const {
assert(0 <= l && l <= n);
assert(g(M::id()));
if (l == n) return n;
l += m;
T sm = M::id();
do {
for (; l % 2 == 0; l >>= 1);
if (!g(M::op(sm, t[l]))) {
while (l < m) {
l = l << 1;
if (g(M::op(sm, t[l]))) sm = M::op(sm, t[l++]);
}
return l - m;
}
sm = M::op(sm, t[l++]);
} while ((l & -l) != l);
return n;
}
template<class G> int min_left(int r, G &&g) const {
assert(0 <= r && r <= n);
assert(g(M::id()));
if (r == 0) return 0;
r += m;
T sm = M::id();
do {
for (r--; r > 1 && r & 1; r >>= 1);
if (!g(M::op(t[r], sm))) {
while (r < m) {
r = r << 1 | 1;
if (g(M::op(t[r], sm))) sm = M::op(t[r--], sm);
}
return r + 1 - m;
}
sm = M::op(t[r], sm);
} while ((r & -r) != r);
return 0;
}
private:
// clang-format off
static int bit_ceil(int n) { int m = 1; while (m < n) m *= 2; return m; }
// clang-format on
void update(int p) { t[p] = M::op(t[p << 1], t[p << 1 | 1]); }
void update_from(int p) {
for (p += m; p >>= 1;) update(p);
}
};
#line 7 "test/yosupo/ds/point_add_range_sum.test.cpp"
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n, q;
cin >> n >> q;
struct M {
using T = int64_t;
static inline constexpr T id() { return 0; }
static inline T op(T l, T r) { return l + r; }
};
SegTree<M> st(n, [](int x) { return cin >> x, x; });
while (q--) {
int t;
cin >> t;
if (t == 0) {
int p, x;
cin >> p >> x;
st[p] += x;
} else {
int l, r;
cin >> l >> r, cout << st(l, r) << "\n";
}
}
}
| Env | Name | Status | Elapsed | Memory |
|---|---|---|---|---|
| g++ | example_00 |
|
5 ms | 4 MB |
| g++ | max_random_00 |
|
187 ms | 12 MB |
| g++ | max_random_01 |
|
183 ms | 12 MB |
| g++ | max_random_02 |
|
179 ms | 12 MB |
| g++ | max_random_03 |
|
178 ms | 12 MB |
| g++ | max_random_04 |
|
182 ms | 12 MB |
| g++ | random_00 |
|
143 ms | 12 MB |
| g++ | random_01 |
|
154 ms | 12 MB |
| g++ | random_02 |
|
107 ms | 4 MB |
| g++ | random_03 |
|
41 ms | 12 MB |
| g++ | random_04 |
|
48 ms | 12 MB |
| g++ | small_00 |
|
5 ms | 4 MB |
| g++ | small_01 |
|
5 ms | 4 MB |
| g++ | small_02 |
|
5 ms | 4 MB |
| g++ | small_03 |
|
5 ms | 4 MB |
| g++ | small_04 |
|
5 ms | 4 MB |
| g++ | small_05 |
|
5 ms | 4 MB |
| g++ | small_06 |
|
5 ms | 4 MB |
| g++ | small_07 |
|
5 ms | 4 MB |
| g++ | small_08 |
|
5 ms | 4 MB |
| g++ | small_09 |
|
5 ms | 4 MB |
| clang++ | example_00 |
|
5 ms | 4 MB |
| clang++ | max_random_00 |
|
180 ms | 12 MB |
| clang++ | max_random_01 |
|
180 ms | 12 MB |
| clang++ | max_random_02 |
|
181 ms | 12 MB |
| clang++ | max_random_03 |
|
180 ms | 12 MB |
| clang++ | max_random_04 |
|
176 ms | 12 MB |
| clang++ | random_00 |
|
147 ms | 12 MB |
| clang++ | random_01 |
|
156 ms | 12 MB |
| clang++ | random_02 |
|
104 ms | 4 MB |
| clang++ | random_03 |
|
38 ms | 12 MB |
| clang++ | random_04 |
|
49 ms | 12 MB |
| clang++ | small_00 |
|
6 ms | 4 MB |
| clang++ | small_01 |
|
5 ms | 4 MB |
| clang++ | small_02 |
|
5 ms | 4 MB |
| clang++ | small_03 |
|
5 ms | 4 MB |
| clang++ | small_04 |
|
5 ms | 4 MB |
| clang++ | small_05 |
|
5 ms | 4 MB |
| clang++ | small_06 |
|
5 ms | 4 MB |
| clang++ | small_07 |
|
5 ms | 4 MB |
| clang++ | small_08 |
|
5 ms | 4 MB |
| clang++ | small_09 |
|
5 ms | 4 MB |