結果
問題 | No.789 範囲の合計 |
ユーザー | Pachicobue |
提出日時 | 2019-03-25 17:09:02 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 92 ms / 1,000 ms |
コード長 | 14,147 bytes |
コンパイル時間 | 2,954 ms |
コンパイル使用メモリ | 212,572 KB |
実行使用メモリ | 44,416 KB |
最終ジャッジ日時 | 2024-10-08 14:21:08 |
合計ジャッジ時間 | 5,459 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 14 ms
44,348 KB |
testcase_01 | AC | 14 ms
44,288 KB |
testcase_02 | AC | 89 ms
44,288 KB |
testcase_03 | AC | 74 ms
44,288 KB |
testcase_04 | AC | 92 ms
44,288 KB |
testcase_05 | AC | 74 ms
44,416 KB |
testcase_06 | AC | 74 ms
44,264 KB |
testcase_07 | AC | 61 ms
44,288 KB |
testcase_08 | AC | 70 ms
44,288 KB |
testcase_09 | AC | 67 ms
44,288 KB |
testcase_10 | AC | 83 ms
44,288 KB |
testcase_11 | AC | 56 ms
44,288 KB |
testcase_12 | AC | 57 ms
44,160 KB |
testcase_13 | AC | 14 ms
44,288 KB |
testcase_14 | AC | 14 ms
44,288 KB |
ソースコード
#include <bits/stdc++.h> #pragma GCC diagnostic ignored "-Wsign-compare" #pragma GCC diagnostic ignored "-Wsign-conversion" //!===========================================================!// //! dP dP dP !// //! 88 88 88 !// //! 88aaaaa88a .d8888b. .d8888b. .d888b88 .d8888b. 88d888b. !// //! 88 88 88ooood8 88' '88 88' '88 88ooood8 88' '88 !// //! 88 88 88. ... 88. .88 88. .88 88. ... 88 !// //! dP dP '88888P' '88888P8 '88888P8 '88888P' dP !// //!===========================================================!// using ld = long double; using uint = unsigned int; using ll = long long; using ull = unsigned long long; template <typename T> constexpr T INF = std::numeric_limits<T>::max() / 4; template <typename T> constexpr T MOD = static_cast<T>(1000000007); template <typename F> constexpr F PI = static_cast<F>(3.1415926535897932385); //! メルセンヌ・ツイスタ !// std::mt19937 mt{std::random_device{}()}; //! Debug出力 !// #define SHOW(...) (std::cerr << "(" << #__VA_ARGS__ << ") = ("), HogeHogeSansuu(__VA_ARGS__), std::cerr << ")" << std::endl struct has_debugPrint_impl { template <class T> static auto check(T&& x) -> decltype(x.debugPrint(), std::true_type{}); template <class T> static auto check(...) -> std::false_type; }; template <class T> class has_debugPrint : public decltype(has_debugPrint_impl::check<T>(std::declval<T>())) { }; template <bool> struct HogeHogeDump { template <typename T> static void dump(const T& x) { x.debugPrint(); } }; template <> struct HogeHogeDump<false> { template <typename T> static void dump(const T& x) { std::cerr << x; } }; void HogeHogeSansuu() { ; } template <typename T> void HogeHogeSansuu(const T& x) { HogeHogeDump<has_debugPrint<T>::value>::dump(x); } template <typename T, typename... Args> void HogeHogeSansuu(const T& x, Args... args) { HogeHogeDump<has_debugPrint<T>::value>::dump(x), std::cerr << ",", HogeHogeSansuu(args...); } //! 自作Assert !// #ifdef HOGEPACHI_ASSERT #define Assert(expr, dump) (not(expr) and (std::cerr << __FILE__ << "(" << __LINE__ << "): Assertion \"" << #expr << "\" failed. [Detail]: ", (dump), exit(1), true)) #else #define Assert(...) void(0) #endif //! chminとchmax !// template <typename T> bool chmin(T& a, const T& b) { return a = std::min(a, b), a == b; } template <typename T> bool chmax(T& a, const T& b) { return a = std::max(a, b), a == b; } //! Rep関数 !// template <typename T, typename F> void For(const T s, const T t, const F f) { for (T i = s; i != t; i += T(s < t ? 1 : -1)) { f(i); } } template <typename T, typename F> void Rep(const T N, const F f) { For<T, F>(0, N, f); } template <typename T, typename F> void RRep(const T N, const F f) { For<T, F>(N - 1, -1, f); } //! Vec関数 !// template <typename T> std::vector<T> Vec(const std::size_t n, T v) { return std::vector<T>(n, v); } template <class... Args> auto Vec(const std::size_t n, Args... args) { return std::vector<decltype(Vec(args...))>(n, Vec(args...)); } //! ビット演算 !// template <typename T> constexpr T popCount(const T u) { #ifdef __has_builtin return u == 0 ? T(0) : (T)__builtin_popcountll(u); #else unsigned long long v = static_cast<unsigned long long>(u); return v = (v & 0x5555555555555555ULL) + (v >> 1 & 0x5555555555555555ULL), v = (v & 0x3333333333333333ULL) + (v >> 2 & 0x3333333333333333ULL), v = (v + (v >> 4)) & 0x0F0F0F0F0F0F0F0FULL, static_cast<T>(v * 0x0101010101010101ULL >> 56 & 0x7f); #endif } template <typename T> constexpr T log2p1(const T u) { #ifdef __has_builtin return u == 0 ? T(0) : T(64 - __builtin_clzll(u)); #else unsigned long long v = static_cast<unsigned long long>(u); return v = static_cast<unsigned long long>(v), v |= (v >> 1), v |= (v >> 2), v |= (v >> 4), v |= (v >> 8), v |= (v >> 16), v |= (v >> 32), popCount(v); #endif } template <typename T> constexpr T clog(const T v) { return v == 0 ? T(0) : log2p1(v - 1); } template <typename T> constexpr T msbp1(const T v) { return log2p1(v); } template <typename T> constexpr T lsbp1(const T v) { #ifdef __has_builtin return __builtin_ffsll(v); #else return v == 0 ? T(0) : popCount((v & (-v)) - T(1)) + T(1); #endif } template <typename T> constexpr bool ispow2(const T v) { return popCount(v) == 1; } template <typename T> constexpr T ceil2(const T v) { return v == 0 ? T(1) : T(1) << log2p1(v - 1); } template <typename T> constexpr T floor2(const T v) { return v == 0 ? T(0) : T(1) << (log2p1(v) - 1); } //! 累積和 !// template <typename T> struct Accum { template <typename InIt> Accum(const InIt first, const InIt last) : accum(std::size_t(std::distance(first, last))) { std::partial_sum(first, last, accum.begin()); } T sum(const std::size_t i) const { return i == 0 ? T(0) : accum[i - 1]; } T sum(const std::size_t l, const std::size_t r) const { return sum(r) - sum(l); } std::vector<T> accum; }; template <typename T> struct Accum2D { Accum2D(const std::vector<std::vector<T>>& t) : accum{t} { for (std::size_t i = 0; i < accum.size(); i++) { for (std::size_t j = 1; j < accum[i].size(); j++) { accum[i][j] += accum[i][j - 1]; } } for (std::size_t i = 1; i < accum.size(); i++) { for (std::size_t j = 0; j < accum[i].size(); j++) { accum[i][j] += accum[i - 1][j]; } } } T sum(const std::size_t y, const std::size_t x) const { return y == 0 or x == 0 ? T(0) : accum[y - 1][x - 1]; } T sum(const std::size_t ymin, const std::size_t ysup, const std::size_t xmin, const std::size_t xsup) const { return sum(ysup, xsup) - sum(ymin, xmin); } std::vector<std::vector<T>> accum; }; //! 座標圧縮 !// template <typename T> struct Zip { template <typename InIt> Zip(const InIt first, const InIt last) : unzip(std::size_t(std::distance(first, last))) { std::copy(first, last, unzip), std::sort(unzip.begin(), unzip.end()), unzip.erase(std::unique(unzip.begin(), unzip.end()), unzip.end()); for (std::size_t i = 0; i < unzip.size(); i++) { zip[unzip[i]] = i; } } std::vector<T> unzip; std::map<T, std::size_t> zip; }; //! STLの出力関数 !// template <typename T, std::size_t N> std::ostream& operator<<(std::ostream& os, const std::array<T, N>& v) { os << "["; for (const auto& e : v) { os << e << ","; } return (os << "]" << std::endl); } template <typename T, typename A> std::ostream& operator<<(std::ostream& os, const std::deque<T, A>& v) { os << "["; for (const auto& e : v) { os << e << ","; } return (os << "]" << std::endl); } template <typename K, typename T, typename C, typename A> std::ostream& operator<<(std::ostream& os, const std::multimap<K, T, C, A>& v) { os << "["; for (const auto& e : v) { os << "<" << e.first << ": " << e.second << ">,"; } return (os << "]" << std::endl); } template <typename T, typename C, typename A> std::ostream& operator<<(std::ostream& os, const std::multiset<T, C, A>& v) { os << "["; for (const auto& e : v) { os << e << ","; } return (os << "]" << std::endl); } template <typename K, typename T, typename C, typename A> std::ostream& operator<<(std::ostream& os, const std::map<K, T, C, A>& v) { os << "["; for (const auto& e : v) { os << "<" << e.first << ": " << e.second << ">,"; } return (os << "]" << std::endl); } template <typename T1, typename T2> std::ostream& operator<<(std::ostream& os, const std::pair<T1, T2>& v) { return (os << "<" << v.first << "," << v.second << ">"); } template <typename T1, typename T2, typename T3> std::ostream& operator<<(std::ostream& os, const std::priority_queue<T1, T2, T3>& v) { auto q = v; os << "["; while (not q.empty()) { os << q.top() << ",", q.pop(); } return os << "]\n"; } template <typename T1, typename T2> std::ostream& operator<<(std::ostream& os, const std::queue<T1>& v) { auto q = v; os << "["; while (not q.empty()) { os << q.front() << ",", q.pop(); } return os << "]\n"; } template <typename T, typename C, typename A> std::ostream& operator<<(std::ostream& os, const std::set<T, C, A>& v) { os << "["; for (const auto& e : v) { os << e << ","; } return (os << "]" << std::endl); } template <typename T1, typename T2> std::ostream& operator<<(std::ostream& os, const std::stack<T1>& v) { auto q = v; os << "["; while (not q.empty()) { os << q.top() << ",", q.pop(); } return os << "]\n"; } template <typename K, typename T, typename H, typename P, typename A> std::ostream& operator<<(std::ostream& os, const std::unordered_multimap<K, T, H, P, A>& v) { os << "["; for (const auto& e : v) { os << "<" << e.first << ": " << e.second << ">,"; } return (os << "]" << std::endl); } template <typename T, typename H, typename P, typename A> std::ostream& operator<<(std::ostream& os, const std::unordered_multiset<T, H, P, A>& v) { os << "["; for (const auto& e : v) { os << e << ","; } return (os << "]" << std::endl); } template <typename K, typename T, typename H, typename P, typename A> std::ostream& operator<<(std::ostream& os, const std::unordered_map<K, T, H, P, A>& v) { os << "["; for (const auto& e : v) { os << "<" << e.first << ": " << e.second << ">,"; } return (os << "]" << std::endl); } template <typename T, typename H, typename P, typename A> std::ostream& operator<<(std::ostream& os, const std::unordered_set<T, H, P, A>& v) { os << "["; for (const auto& e : v) { os << e << ","; } return (os << "]" << std::endl); } template <typename T, typename A> std::ostream& operator<<(std::ostream& os, const std::vector<T, A>& v) { os << "["; for (const auto& e : v) { os << e << ","; } return (os << "]" << std::endl); } //!=============================================================================!// //! 888888ba .d88888b d888888P !// //! 88 '8b 88. "' 88 !// //! 88 88 'Y88888b. .d8888b. .d8888b. 88 88d888b. .d8888b. .d8888b. !// //! 88 88 '8b 88ooood8 88' '88 88 88' '88 88ooood8 88ooood8 !// //! 88 .8P d8' .8P 88. ... 88. .88 88 88 88. ... 88. ... !// //! 8888888P Y88888P '88888P' '8888P88 dP dP '88888P' '88888P' !// //! .88 !// //! d8888P !// //!=============================================================================!// template <typename Monoid, std::size_t B = 30, typename Ind = std::size_t, std::size_t POOL = (1 << 20)> class DSegTree { public: DSegTree() {} static constexpr Ind SUP = (Ind)1 << B; using T = typename Monoid::T; T get(const Ind a) const { return fold(a, a + 1); } void set(const Ind a, const T& val) { root = update(root, a, val, 0, SUP); } T fold(const Ind L, const Ind R) const { auto dfs = [&](auto&& self, const Ptr p, const Ind l, const Ind r, const Ind inf, const Ind sup) -> T { if (p == nullptr or sup <= l or r <= inf) { return Monoid::id(); } if (l <= inf and sup <= r) { return p->V; } const Ind leaf = p->leaf, mid = (inf + sup) >> 1; return (l <= leaf and leaf < r ? acc(self(self, p->left, l, r, inf, mid), acc(p->LV, self(self, p->right, l, r, mid, sup))) : acc(self(self, p->left, l, r, inf, mid), self(self, p->right, l, r, mid, sup))); }; return dfs(dfs, root, L, R, 0, SUP); } private: const Monoid acc{}; struct Node { Node() : V{Monoid::id()} {} Node(const Ind l, const T& v, const T& lv) : leaf(l), V(v), LV(lv) {} Ind leaf; T V, LV; Node *left = nullptr, *right = nullptr; }; using Ptr = Node*; static T value(const Ptr p) { return p ? p->V : Monoid::id(); } static Node* alloc(const Ind l, const T& v, const T& lv) { static std::size_t head = 0; static Node buffer[POOL]; Assert(head < POOL, std::cerr << "head(" << head << ") >= POOL(" << POOL << ")\n"); return buffer[head++] = Node(l, v, lv), buffer + head - 1; } static Node* update(Ptr p, Ind a, T v, const Ind inf, const Ind sup) { static Monoid acc; if (p == nullptr) { return alloc(a, v, v); } const Ind l = p->leaf, mid = (inf + sup) >> 1; if (l == a) { return p->LV = v, p->V = acc(value(p->left), acc(p->LV, value(p->right))), p; } else if (a < mid) { if (l < a) { std::swap(p->leaf, a), std::swap(p->LV, v); } p->left = update(p->left, a, v, inf, mid); } else { if (l > a) { std::swap(p->leaf, a), std::swap(p->LV, v); } p->right = update(p->right, a, v, mid, sup); } return p->V = acc(value(p->left), acc(p->LV, value(p->right))), p; } Ptr root = nullptr; }; //!=================================!// //! .d88888b !// //! 88. "' !// //! 'Y88888b. dP dP 88d8b.d8b. !// //! '8b 88 88 88''88''88 !// //! d8' .8P 88. .88 88 88 88 !// //! Y88888P '88888P' dP dP dP !// //!=================================!// template <typename X> struct Sum { using T = X; T operator()(const T& a, const T& b) const { return a + b; } static constexpr T id() { return T{}; } }; int main() { std::cin.tie(nullptr); std::ios::sync_with_stdio(false); DSegTree<Sum<ll>> dseg; int Q; std::cin >> Q; ll ans = 0; for (int q = 0; q < Q; q++) { int t; std::cin >> t; if (t == 0) { int x, y; std::cin >> x >> y; const auto p = dseg.get(x); dseg.set(x, p + y); } else { int l, r; std::cin >> l >> r, r++; ans += dseg.fold(l, r); } } std::cout << ans << std::endl; return 0; }