結果
問題 | No.789 範囲の合計 |
ユーザー | Suu0313 |
提出日時 | 2021-08-15 01:03:16 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 196 ms / 1,000 ms |
コード長 | 1,614 bytes |
コンパイル時間 | 2,142 ms |
コンパイル使用メモリ | 208,644 KB |
実行使用メモリ | 34,688 KB |
最終ジャッジ日時 | 2024-10-06 05:30:49 |
合計ジャッジ時間 | 4,627 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,820 KB |
testcase_01 | AC | 1 ms
6,816 KB |
testcase_02 | AC | 182 ms
28,672 KB |
testcase_03 | AC | 90 ms
6,820 KB |
testcase_04 | AC | 196 ms
31,872 KB |
testcase_05 | AC | 175 ms
27,520 KB |
testcase_06 | AC | 178 ms
28,672 KB |
testcase_07 | AC | 85 ms
6,816 KB |
testcase_08 | AC | 177 ms
34,688 KB |
testcase_09 | AC | 160 ms
31,872 KB |
testcase_10 | AC | 169 ms
20,096 KB |
testcase_11 | AC | 145 ms
28,288 KB |
testcase_12 | AC | 151 ms
28,288 KB |
testcase_13 | AC | 2 ms
6,816 KB |
testcase_14 | AC | 2 ms
6,820 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; template<typename T> struct DynamicSegTree{ using OP = function<T(T,T)>; uint64_t n, n0; const T id; const OP op; DynamicSegTree(uint64_t n_, const T &id, const OP &op) : n(1), n0(n_), id(id),op(op){ while(n < n_) n<<=1; } void change(uint64_t k, const T &x){ root = change(root, k, x, 0, n); } T query(uint64_t l, uint64_t r) const { return query(root, l, r, 0, n); } T all_query() const { return query(0, n); } T at(uint64_t k) const { return query(k, k+1); } private: struct Node{ T val; Node *l, *r; Node(const T &v): val(v), l(nullptr), r(nullptr) {} } *root = nullptr; using np = Node*; T val(np t) const { return !t ? id : t->val; } np change(np t, uint64_t k, const T &x, uint64_t l, uint64_t r){ if(!t) t = new Node(id); if(l+1==r){ t->val = x; return t; } uint64_t m = l + ((r-l) >> 1); if(k < m) t->l = change(t->l, k, x, l, m); else t->r = change(t->r, k, x, m, r); t->val = op(val(t->l), val(t->r)); return t; } T query(np t, uint64_t ql, uint64_t qr, uint64_t l, uint64_t r) const { if(!t || r<=ql || qr<=l) return id; if(ql<=l && r<=qr) return t->val; uint64_t m = l + ((r-l) >> 1); return op(query(t->l, ql, qr, l, m), query(t->r, ql, qr, m, r)); } }; int main() { DynamicSegTree<uint64_t> seg(1000000001, 0, [](auto a, auto b){ return a+b; }); int n; cin >> n; uint64_t sum = 0; while(n--){ int t, x, y; cin >> t >> x >> y; if(t) sum += seg.query(x, y+1); else seg.change(x, seg.at(x) + y); } cout << sum << "\n"; }