#include #include using namespace std; #define rep(i, n) for (long long i = 0; i < (long long)(n); i++) #define FOR(i, s, e) for (long long i = (long long)(s); i <= (long long)(e); i++) #define printYesNo(is_ok) puts(is_ok ? "Yes" : "No"); #define SORT(v) sort(v.begin(), v.end()); #define RSORT(v) sort(v.rbegin(), v.rend()); #define REVERSE(v) reverse(v.begin(), v.end()); long long op(long long a, long long b) { return a + b; } long long e() { return 0; } template struct segtree { static_assert(std::is_convertible_v>, "op must work as S(S, S)"); static_assert(std::is_convertible_v>, "e must work as S()"); public: segtree() {}; void set(int p, S x) { p += size; d[p] = x; for (int i = 1; i <= log; i++) { update(p >> i); } } S get(int p) { return d[p + size]; } S prod(int l, int r) { assert(0 <= l && l <= r); S sml = e(), smr = e(); l += size, r += size; while (l < r) { if (l & 1) sml = op(sml, d[l++]); if (r & 1) smr = op(d[--r], smr); l >>= 1; r >>= 1; } return op(sml, smr); } S all_prod() { return d[1]; } private: int size = 1 << 30, log = 30; std::unordered_map d; void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); } }; int main() { int n; cin >> n; segtree dynamic_seg; long long ans = 0; rep(_, n) { int p; cin >> p; if (p == 0) { int x, y; cin >> x >> y; dynamic_seg.set(x, dynamic_seg.get(x) + y); } if (p == 1) { int l, r; cin >> l >> r; ans += dynamic_seg.prod(l, r + 1); } } cout << ans << endl; return 0; };