/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 1ms 532.0 KiB
#2 Accepted 1ms 532.0 KiB
#3 Accepted 1ms 444.0 KiB
#4 Accepted 1ms 532.0 KiB
#5 Accepted 1ms 536.0 KiB
#6 Accepted 1ms 532.0 KiB
#7 Accepted 125ms 5.605 MiB
#8 Accepted 129ms 5.77 MiB
#9 Accepted 135ms 5.645 MiB
#10 Accepted 141ms 5.77 MiB
#11 Accepted 56ms 5.27 MiB
#12 Accepted 181ms 6.27 MiB
#13 Accepted 138ms 5.762 MiB

Code

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 9;
const int M = 1e9 + 7;

int a[N];
int seg_or[4 * N], seg_xor[4 * N];

void build(int n, int b, int e)
{
    if (b == e)
    {
        seg_or[n] = a[b];
        seg_xor[n] = a[b];
        return;
    }
    int mid = (b + e) >> 1, l = n << 1, r = l | 1;
    build(l, b, mid);
    build(r, mid + 1, e);
    seg_or[n] = seg_or[l] | seg_or[r];
    seg_xor[n] = seg_xor[l] ^ seg_xor[r];
}

void upd(int n, int b, int e, int pos, int x)
{
    if (b > pos || e < pos)
        return;
    if (b == e && b == pos)
    {
        seg_or[n] = x;
        seg_xor[n] = x;
        a[pos] = x;
        return;
    }
    int mid = (b + e) >> 1, l = n << 1, r = l | 1;
    upd(l, b, mid, pos, x);
    upd(r, mid + 1, e, pos, x);
    seg_or[n] = seg_or[l] | seg_or[r];
    seg_xor[n] = seg_xor[l] ^ seg_xor[r];
}

pair<int, int> query(int n, int b, int e, int l, int r)
{
    if (b > r || e < l)
        return {0, 0};
    if (b >= l && e <= r)
        return {seg_or[n], seg_xor[n]};
    int mid = (b + e) >> 1, lc = n << 1, rc = lc | 1;
    auto left = query(lc, b, mid, l, r);
    auto right = query(rc, mid + 1, e, l, r);
    return {left.first | right.first, left.second ^ right.second};
}

int binpow(int a, int b)
{
    int res = 1;
    while (b)
    {
        if (b & 1)
            res = (res * a) % M;
        a = (a * a) % M;
        b >>= 1;
    }
    return res;
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, q;
    cin >> n >> q;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    build(1, 1, n);
    while (q--)
    {
        int type, l, r;
        cin >> type >> l >> r;
        if (type == 1)
        {
            a[l] ^= r;
            upd(1, 1, n, l, a[l]);
        }
        else
        {
            auto [orr, xorr] = query(1, 1, n, l, r);
            int m = r - l + 1;
            int ans = 0;
            for (int k = 0; k < 20; k++)
            {
                if (orr & (1 << k))
                {
                    ans = (ans + (1LL << k) * binpow(2, m - 1)) % M;
                }
            }
            cout << ans << '\n';
        }
    }
    return 0;
}

Information

Submit By
Type
Submission
Problem
P1183 The Sorcerer’s Subsequence Sum
Contest
Brain Booster #9
Language
C++17 (G++ 13.2.0)
Submit At
2025-04-06 17:09:54
Judged At
2025-04-06 17:09:54
Judged By
Score
100
Total Time
181ms
Peak Memory
6.27 MiB