Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC optimize("03")
- #define _CRT_SECURE_NO_WARNINGS
- #include "bits/stdc++.h"
- using namespace std;
- using namespace chrono;
- #define all(a) a.begin(), a.end()
- #define allr(a) a.rbegin(), a.rend()
- #define endl "\n"
- mt19937 rnd(std::chrono::high_resolution_clock::now().time_since_epoch().count());
- typedef long long ll;
- typedef long double ld;
- constexpr int N = 65;
- const int MAXN = 5e5 + 10;
- bitset<N> tree[4 * MAXN];
- bitset<N> mod[4 * MAXN];
- int a[MAXN];
- void build(ll v, ll tl, ll tr) {
- if (tl == tr) {
- tree[v] = a[tl];
- return;
- }
- ll mid = (tl + tr) >> 1;
- build(v << 1, tl, mid);
- build((v << 1) | 1, mid + 1, tr);
- tree[v] = tree[v << 1] ^ tree[(v << 1) | 1];
- }
- void push(ll v) {
- tree[v] = tree[v] ^ mod[v];
- if ((v << 1) | 1 > 4 * MAXN) {
- mod[v] = 0;
- return;
- }
- mod[v << 1] = mod[v << 1] ^ mod[v];
- mod[(v << 1) | 1] = mod[(v << 1) | 1] ^ mod[v];
- mod[v] = 0;
- }
- void update(ll v, ll tl, ll tr, ll l, ll r, ll x) {
- push(v);
- if (tr<l || tl>r) {
- return;
- }
- if (tl >= l && tr <= r) {
- bitset<N> sub = x;
- mod[v] = mod[v] ^ sub ;
- push(v);
- }
- ll mid = (tl + tr) / 2;
- update(v << 1, tl, mid, l, r, x);
- update((v << 1) | 1, mid + 1, tr, l, r, x);
- tree[v] = tree[v << 1] ^ tree[(v << 1) | 1];
- }
- bitset<N> get_xor(ll v, ll tl ,ll tr, ll l, ll r) {
- push(v);
- if (tr<l || tl>r) {
- return 0;
- }
- if (tl >= l && tr <= r) {
- return tree[v];
- }
- ll mid = (tl + tr) / 2;
- return get_xor(v * 2, tl, mid, l, r) ^ get_xor(v * 2 + 1, mid + 1, tr, l, r);
- }
- signed main() {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- srand(time(NULL));
- ll n, m;
- cin >> n >> m;
- for (ll i = 0; i < n; i++) {
- cin >> a[i];
- }
- ll m;
- cin >> m;
- for (ll i = 0; i < m; i++) {
- string s;
- cin >> s;
- if (s == "get") {
- string xr;
- cin >> xr;
- if (xr == "xor") {
- ll l, r, x;
- cin >> l >> r;
- l--, r--;
- bitset<N>ans = get_xor(1, 0, n - 1, l, r);
- }
- }
- else if (s == "upd") {
- string xr;
- cin >> xr;
- if (xr == "xor") {
- ll l, r, x;
- cin >> l >> r >> x;
- l--, r--;
- update(1, 0, n - 1, l, r,x);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement