結果
問題 |
No.789 範囲の合計
|
ユーザー |
|
提出日時 | 2025-06-14 17:30:07 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 5,724 bytes |
コンパイル時間 | 5,633 ms |
コンパイル使用メモリ | 334,548 KB |
実行使用メモリ | 7,848 KB |
最終ジャッジ日時 | 2025-06-14 17:30:15 |
合計ジャッジ時間 | 8,462 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 4 WA * 11 |
ソースコード
#pragma region Macros #include <bits/stdc++.h> #include <atcoder/all> using namespace std; using namespace atcoder; using lint = long long; using mint = modint998244353; using ull = unsigned long long; using ld = long double; using int128 = __int128_t; #define all(x) (x).begin(), (x).end() #define EPS 1e-8 #define uniqv(v) v.erase(unique(all(v)), v.end()) #define OVERLOAD_REP(_1, _2, _3, name, ...) name #define REP1(i, n) for (auto i = std::decay_t<decltype(n)>{}; (i) != (n); ++(i)) #define REP2(i, l, r) for (auto i = (l); (i) != (r); ++(i)) #define rep(...) OVERLOAD_REP(__VA_ARGS__, REP2, REP1)(__VA_ARGS__) #define log(x) cout << x << endl #define logfixed(x) cout << fixed << setprecision(10) << x << endl; #define logy(bool) \ if (bool) { \ cout << "Yes" << endl; \ } else { \ cout << "No" << endl; \ } ostream &operator<<(ostream &dest, __int128_t value) { ostream::sentry s(dest); if (s) { __uint128_t tmp = value < 0 ? -value : value; char buffer[128]; char *d = end(buffer); do { --d; *d = "0123456789"[tmp % 10]; tmp /= 10; } while (tmp != 0); if (value < 0) { --d; *d = '-'; } int len = end(buffer) - d; if (dest.rdbuf()->sputn(d, len) != len) { dest.setstate(ios_base::badbit); } } return dest; } template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) { for (int i = 0; i < (int)v.size(); i++) { os << v[i] << (i + 1 != (int)v.size() ? " " : ""); } return os; } template <typename T> ostream &operator<<(ostream &os, const set<T> &set_var) { for (auto itr = set_var.begin(); itr != set_var.end(); itr++) { os << *itr; ++itr; if (itr != set_var.end()) os << " "; itr--; } return os; } template <typename T, typename U> ostream &operator<<(ostream &os, const map<T, U> &map_var) { for (auto itr = map_var.begin(); itr != map_var.end(); itr++) { os << itr->first << " -> " << itr->second << "\n"; } return os; } template <typename T, typename U> ostream &operator<<(ostream &os, const pair<T, U> &pair_var) { os << "(" << pair_var.first << ", " << pair_var.second << ")"; return os; } void out() { cout << '\n'; } template <class T, class... Ts> void out(const T &a, const Ts &...b) { cout << a; (cout << ... << (cout << ' ', b)); cout << '\n'; } template <typename T> istream &operator>>(istream &is, vector<T> &v) { for (T &in : v) is >> in; return is; } inline void in(void) { return; } template <typename First, typename... Rest> void in(First &first, Rest &...rest) { cin >> first; in(rest...); return; } template <typename T> bool chmax(T &a, const T &b) { if (a < b) { a = b; return true; } return false; } template <typename T> bool chmin(T &a, const T &b) { if (a > b) { a = b; return true; } return false; } vector<lint> dx8 = {1, 1, 0, -1, -1, -1, 0, 1}; vector<lint> dy8 = {0, 1, 1, 1, 0, -1, -1, -1}; vector<lint> dx4 = {1, 0, -1, 0}; vector<lint> dy4 = {0, 1, 0, -1}; #pragma endregion template <class S, auto op, auto e> class DynamicSegmentTree { private: struct Node { S value; Node *left; Node *right; Node(S value) : value(value), left(nullptr), right(nullptr) {} }; long long n; Node *root = nullptr; void set(S x, Node *&t, long long a, long long b, long long l = 0, long long r = -1) { if (r < 0) r = n; if (r <= a or b <= l) return; if (!t) t = new Node(e()); if (r - l == 1) { t->value = x; return; } long long m = (l + r) >> 1ll; set(x, t->left, a, b, l, m); set(x, t->right, a, b, m, r); if (t->left and t->right) { t->value = op(t->left->value, t->right->value); } else if (t->left) { t->value = t->left->value; } else if (t->right) { t->value = t->right->value; } } S prod(Node *&t, long long a, long long b, long long l = 0, long long r = -1) { if (r < 0) r = n; if (!t or r <= a or b <= l) return e(); if (a <= l and r <= b) { return t->value; } long long m = (l + r) >> 1ll; return op(prod(t->left, a, b, l, m), prod(t->right, a, b, m, r)); } template <auto f> long long max_right(bool &fin, S &p, Node *&t, long long a, long long l = 0, long long r = -1) { if (r < 0) r = n; if (l >= r) { fin = true; return r; } if (fin or r <= a) return l; if (!t) { S val = op(p, e()); if (f(val)) { p = val; return r; } else { fin = true; return l; } } if (a <= l) { S val = op(p, t->value); if (f(val)) { p = val; return r; } } long long m = (l + r) >> 1ll; long long res = max_right<f>(fin, p, t->left, a, l, m); if (fin) return res; return max_right<f>(fin, p, t->right, a, m, r); } public: DynamicSegmentTree() {} DynamicSegmentTree(long long n_) { n = bit_ceil(uint64_t(n_)); } void set(long long p, S x) { set(x, root, p, p + 1); } S get(long long p) { return prod(root, p, p + 1); } S prod(long long l, long long r) { return prod(root, l, r); } template <auto g> long long max_right(long long l) { S p = e(); bool fin = false; return max_right<g>(fin, p, root, l); } }; using S = lint; S op(S a, S b) { return a + b; } S e() { return 0; } int main() { DynamicSegmentTree<S, op, e> seg(200010); int n; in(n); lint res = 0; rep(i, n) { int com; in(com); if (com == 0) { lint x, y; in(x, y); seg.set(x, seg.get(x) + y); } else { lint l, r; in(l, r); res += seg.prod(l, r + 1); } } out(res); }