/ SeriousOJ /

Record Detail

Memory Exceeded


  
# Status Time Cost Memory Cost
#1 Memory Exceeded ≥79ms ≥256.016 MiB
#2 Memory Exceeded ≥80ms ≥256.016 MiB

Code

#ifndef LOCAL
#include <bits/stdc++.h>
#define debug(...)
#endif

using namespace std;
#define int long long
#define cinv(v) for (auto &it:v) cin>>it;
#define coutv(v) for (auto &it:v) cout<< it<<' '; cout<<'\n';

const int bit = 22, N = 1e6 + 5, MOD = 1e9 + 7;

struct ST {
    int t[4 * N];

    ST() {
        memset(t, 0, sizeof t);
    }

    int merge(int a, int b) { return a + b; };

    void upd(int n, int s, int e, int i, int v) {
        if (s == e) return void(t[n] = v);
        int m = (s + e) / 2;
        i <= m ? upd(n * 2, s, m, i, v) : upd(n * 2 + 1, m + 1, e, i, v);
        t[n] = merge(t[n * 2], t[n * 2 + 1]);
    }

    int query(int n, int s, int e, int l, int r) {
        if (s > r || e < l) return 0;
        if (s >= l && e <= r) return t[n];
        int m = (s + e) / 2;
        return merge(query(n * 2, s, m, l, r), query(n * 2 + 1, m + 1, e, l, r));
    }
};

ST tree[bit];
int arr[N], pw[N];

void shelby() {
    int n, q;
    cin >> n >> q;
    for (int i = 1; i <= n; ++i) {
        cin >> arr[i];
        for (int j = 0; j < bit; ++j) {
            if ((arr[i] >> j) & 1) tree[j].upd(1, 1, n, i, 1);
        }
    }
    while (q--) {
        int t;
        cin >> t;
        if (t == 1) {
            int i, x;
            cin >> i >> x;
            arr[i] ^= x;
            for (int j = 0; j < bit; ++j) {
                if ((arr[i] >> j) & 1) tree[j].upd(1, 1, n, i, 1);
                else tree[j].upd(1, 1, n, i, 0);
            }
        }
        else {
            int l, r;
            cin >> l >> r;
            int ans = 0;
            for (int i = 0; i < bit; ++i) {
                int on = tree[i].query(1, 1, n, l, r);
                int tot = pw[on - 1] * (1 << i) % MOD * pw[(r - l + 1) - on] % MOD;
                ans = (ans + (tot)) % MOD;
            }
            cout << ans << '\n';
        }
    }
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    pw[0] = 1;
    for (int i = 1; i < N; ++i) pw[i] = pw[i - 1] * 2 % MOD;
    int t = 1;
    // cin >> t;
    for (int _ = 1; _ <= t; ++_) {
        // cout << "Case " << _ << ": ";
        shelby();
    }
}

Information

Submit By
Type
Submission
Problem
P1183 The Sorcerer’s Subsequence Sum
Language
C++17 (G++ 13.2.0)
Submit At
2025-04-11 09:53:07
Judged At
2025-04-11 09:53:07
Judged By
Score
0
Total Time
≥80ms
Peak Memory
≥256.016 MiB