結果
問題 |
No.879 Range Mod 2 Query
|
ユーザー |
![]() |
提出日時 | 2025-09-03 14:10:15 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 6,111 bytes |
コンパイル時間 | 3,275 ms |
コンパイル使用メモリ | 288,476 KB |
実行使用メモリ | 10,888 KB |
最終ジャッジ日時 | 2025-09-03 14:10:22 |
合計ジャッジ時間 | 7,141 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 3 WA * 18 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; bool chmin(auto &a, auto b) { return a > b ? a = b, true : false; } bool chmax(auto &a, auto b) { return a < b ? a = b, true : false; } template<typename ActMonoid> struct lazy_segtree { using M = ActMonoid; using S = typename M::S; using F = typename M::F; lazy_segtree() : lazy_segtree(0) {} lazy_segtree(int _n) : lazy_segtree(vector<S>(_n, M::e())) {} lazy_segtree(const vector<S> &v) { init(v); } void set(const vector<S> &v) { init(v); } void set(int p, const S &x) { assert(0 <= p && p < n); p += sz; inner_push(p); d[p] = x; inner_update(p); } void apply(int p, const F &f) { assert(0 <= p && p < n); p += sz; inner_push(p); d[p] = M::map(f, d[p]); inner_update(p); } void apply(int l, int r, const F &f) { assert(0 <= l && l <=r && r <= n); l += sz; r += sz; for (int i = log; i >= 1; i--) { if (((l >> i) << i) != l) push(l >> i); if (((r >> i) << i) != r) push((r - 1) >> i); } int l2 = l, r2 = r; while (l < r) { if (l & 1) all_apply(l++, f); if (r & 1) all_apply(--r, f); l >>= 1; r >>= 1; } l = l2, r = r2; for (int i = 1; i <= log; i++) { if (((l >> i) << i) != l) update(l >> i); if (((r >> i) << i) != r) update((r - 1) >> i); } } S get(int p) { assert(0 <= p && p < n); p += sz; inner_push(p); return d[p]; } S prod(int l, int r) { assert(0 <= l && l <=r && r <= n); l += sz; r += sz; for (int i = log; i >= 1; i--) { if (((l >> i) << i) != l) push(l >> i); if (((r >> i) << i) != r) push((r - 1) >> i); } S pl = M::e(), pr = M::e(); while (l < r) { if (l & 1) pl = M::op(pl, d[l++]); if (r & 1) pr = M::op(d[--r], pr); l >>= 1; r >>= 1; } return M::op(pl, pr); } S all_prod() const { return d[1]; } template<typename C> int max_right(int l, const C &check) { assert(0 <= l && l <= n); assert(check(M::e())); if (l == n) return l; l += sz; inner_push(l); S p = M::e(); do { while (!(l & 1)) l >>= 1; S np = M::op(p, d[l]); if (!check(np)) { while (l < sz) { l <<= 1; np = M::op(p, d[l]); if (check(np)) { p = np; l++; } } return l - sz; } p = np; l++; } while ((l & -l) != l); return n; } template<typename C> int max_right(const C &check) { return max_right(0, check); } template<typename C> int min_left(int r, int l, const C &check) { assert(0 <= r && r <= n); assert(check(M::e())); if (r == 0) return l; r += sz; inner_push(r - 1); S p = M::e(); do { r--; while (r > 1 && r & 1) r >>= 1; S np = M::op(d[r], p); if (!check(np)) { while (r < sz) { push(r); (r <<= 1)++; np = M::op(d[r], p); if (check(np)) { p = np; r--; } } return r + 1 - sz; } p = np; } while ((r & -r) != r); return 0; } template<typename C> int min_left(const C &check) { return min_left(n, check); } private: int n, log, sz; vector<S> d; vector<F> lz; void init(const vector<S> &v) { n = v.size(); log = 1; while ((1 << log) < n) log++; sz = 1 << log; d = vector<S>(2 * sz, M::e()); lz = vector<F>(sz, M::id()); for (int i = 0; i < n; i++) d[i + sz] = v[i]; for (int i = sz - 1; i >= 1; i--) update(i); } void update(int p) { d[p] = M::op(d[2 * p], d[2 * p + 1]); } void all_apply(int p, const F &f) { d[p] = M::map(f, d[p]); if (p < sz) lz[p] = M::comp(f, lz[p]); } void push(int p) { all_apply(2 * p, lz[p]); all_apply(2 * p + 1, lz[p]); lz[p] = M::id(); } void inner_update(int p) { for (int i = 1; i <= log; i++) update(p >> i); } void inner_push(int p) { for (int i = log; i >= 1; i--) push(p >> i); } }; struct M { using S = tuple<ll, int, int>; static S op(S a, S b) { ll sum = get<0>(a) + get<0>(b); int odd = get<1>(a) + get<1>(b); int even = get<2>(a) + get<2>(b); return {sum, odd, even}; } static S e() { return {0, 0, 0}; } using F = pair<bool, ll>; static F comp(F f, F g) { if (f.first) return f; g.second += f.second; return g; } static F id() { return {false, 0}; } static S map(F f, S x) { auto [sum, odd, even] = x; if (f.first) { sum = odd; } sum += f.second * ll(odd + even); if (f.second & 1) swap(odd, even); return {sum, odd, even}; } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, Q; cin >> N >> Q; lazy_segtree<M> seg(N); for (int i = 0, A; i < N; i++) { cin >> A; seg.set(i, {A, A % 2 == 1, A % 2 == 0}); } while (Q--) { int t, l, r; cin >> t >> l >> r; l--; if (t == 1) { seg.apply(l, r, {true, 0}); } else if (t == 2) { int x; cin >> x; seg.apply(l, r, {false, x}); } else { cout << get<0>(seg.prod(l, r)) << '\n'; } } }