Submission #1296107

#TimeUsernameProblemLanguageResultExecution timeMemory
1296107misanthropistDeda (COCI17_deda)C++20
140 / 140
57 ms5332 KiB
/// @author Huy /// @since 17:38:34 27/11/2025 #include <bits/stdc++.h> #include <vector> #include <cassert> #ifndef CP_DS_QUERY_SEGMENT_TREE #define CP_DS_QUERY_SEGMENT_TREE namespace cp { namespace ds { template <typename Tp> class segment_tree { public: using value_type = Tp; segment_tree() : n(0), size(0) {} segment_tree(int n, const value_type& val = value_type()) { init(n, val); } segment_tree(const std::vector<value_type>& data) { init(data); } void init(int n, const value_type& val = value_type()) { std::vector<value_type> data(n, val); init(data); } void init(const std::vector<value_type>& data) { n = static_cast<int>(data.size()); for (size = 1; size < n; size <<= 1); tree.assign(2 * size, value_type()); for (int i = 0; i < n; ++i) tree[size + i] = data[i]; for (int i = size - 1; i > 0; --i) pull(i); } void modify(int p, const value_type& val) { assert(0 <= p && p < n); p += size; tree[p] = val; for (p >>= 1; p > 0; p >>= 1) pull(p); } value_type point_query(int p) const { assert(0 <= p && p < n); return tree[p + size]; } value_type range_query(int l, int r) const { assert(0 <= l && l <= r && r <= n); value_type sml = value_type(); value_type smr = value_type(); l += size; r += size; while (l < r) { if (l & 1) sml = sml + tree[l++]; if (r & 1) smr = tree[--r] + smr; l >>= 1; r >>= 1; } return sml + smr; } value_type all_query() const { return tree[1]; } template <typename F> int max_right(int l, F&& pred) const { assert(0 <= l && l <= n); if (l == n) return n; value_type sm = value_type(); l += size; do { while ((l & 1) == 0) l >>= 1; if (!pred(sm + tree[l])) { while (l < size) { l <<= 1; if (pred(sm + tree[l])) sm = sm + tree[l++]; } return l - size; } sm = sm + tree[l++]; } while ((l & -l) != l); return n; } template <typename F> int min_left(int r, F&& pred) const { assert(0 <= r && r <= n); if (r == 0) return 0; value_type sm = value_type(); r += size; do { --r; while (r > 1 && (r & 1)) r >>= 1; if (!pred(tree[r] + sm)) { while (r < size) { r = (r << 1) | 1; if (pred(tree[r] + sm)) sm = tree[r--] + sm; } return r + 1 - size; } sm = tree[r] + sm; } while ((r & -r) != r); return 0; } private: int n, size; std::vector<value_type> tree; void pull(int i) { tree[i] = tree[i << 1] + tree[(i << 1) | 1]; } }; } // namespace ds } // namespace cp #endif constexpr int inf = 2e9; struct info { int val = inf; }; info operator+(const info& a, const info& b) { return {std::min(a.val, b.val)}; } signed main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); int n, q; std::cin >> n >> q; cp::ds::segment_tree<info> seg(n); while (q--) { char tp; std::cin >> tp; if (tp == 'M') { int x, a; std::cin >> x >> a; seg.modify(a - 1, {x}); } else { int y, b; std::cin >> y >> b; auto pred = [&](const info& node) { return node.val > y; }; int i = seg.max_right(b - 1, pred); if (i == n) { std::cout << "-1\n"; } else { std::cout << i + 1 << '\n'; } } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...