sotanishy's code snippets for competitive programming
View the Project on GitHub sotanishy/cp-library-cpp
#define PROBLEM \ "http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_B" #include <bits/stdc++.h> #include "../../data-structure/fenwick_tree.hpp" using namespace std; struct Monoid { using T = int; static T id() { return 0; } static T op(T a, T b) { return a + b; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(0); int n, q; cin >> n >> q; FenwickTree<Monoid> ft(n); for (int i = 0; i < q; i++) { int com, x, y; cin >> com >> x >> y; if (com == 0) ft.update(x - 1, y); else cout << (ft.prefix_fold(y) - ft.prefix_fold(x - 1)) << "\n"; } }
#line 1 "test/aoj/DSL_2_B.test.cpp" #define PROBLEM \ "http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_B" #include <bits/stdc++.h> #line 4 "data-structure/fenwick_tree.hpp" template <typename M> class FenwickTree { using T = M::T; public: FenwickTree() = default; explicit FenwickTree(int n) : n(n), data(n + 1, M::id()) {} T prefix_fold(int i) const { T ret = M::id(); for (; i > 0; i -= i & -i) ret = M::op(ret, data[i]); return ret; } void update(int i, const T& x) { for (++i; i <= n; i += i & -i) data[i] = M::op(data[i], x); } int lower_bound(const T& x) const { return lower_bound(x, std::less<>()); } template <typename Compare> int lower_bound(const T& x, Compare cmp) const { if (!cmp(M::id(), x)) return 0; int k = 1; while (k * 2 <= n) k <<= 1; int i = 0; T v = M::id(); for (; k > 0; k >>= 1) { if (i + k > n) continue; T nv = M::op(v, data[i + k]); if (cmp(nv, x)) { v = nv; i += k; } } return i + 1; } private: int n; std::vector<T> data; }; #line 7 "test/aoj/DSL_2_B.test.cpp" using namespace std; struct Monoid { using T = int; static T id() { return 0; } static T op(T a, T b) { return a + b; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(0); int n, q; cin >> n >> q; FenwickTree<Monoid> ft(n); for (int i = 0; i < q; i++) { int com, x, y; cin >> com >> x >> y; if (com == 0) ft.update(x - 1, y); else cout << (ft.prefix_fold(y) - ft.prefix_fold(x - 1)) << "\n"; } }