Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int int64_t
- using namespace std;
- const int N = 1e5 + 15;
- int n;
- int a[N];
- int lazy[N * 4];
- int t[N * 4][8];
- void recalc (int v, int val) {
- int cnt[8]{};
- for (int i = 0; i < 8; i++) {
- cnt[i ^ val] = t[v][i];
- }
- for (int i = 0; i < 8; i++)
- t[v][i] = cnt[i];
- }
- void push (int v) {
- if ((v<<1|1) < 400'004 && lazy[v]) {
- lazy[v<<1|1] ^= lazy[v];
- lazy[v<<1] ^= lazy[v];
- recalc(v<<1, lazy[v]);
- recalc(v<<1|1, lazy[v]);
- lazy[v] = 0;
- }
- }
- void build (int v, int tl, int tr) {
- if (tl == tr) {
- t[v][a[tl]] = 1;
- return;
- }
- int tm = (tl + tr)>>1;
- build(v<<1, tl, tm);
- build(v<<1|1, tm + 1, tr);
- for (int i = 0; i < 8; i++)
- t[v][i] = t[v<<1][i] + t[v<<1|1][i];
- }
- void update (int v, int tl, int tr, int l, int r, int val) {
- if (l > r) {
- return;
- }
- push(v);
- if (l == tl && r == tr) {
- recalc(v, val);
- lazy[v] = val;
- return;
- }
- int tm = (tl + tr)>>1;
- update(v<<1, tl, tm, l, min(r, tm), val);
- update(v<<1|1, tm + 1, tr, max(l, tm + 1), r, val);
- for (int i = 0; i < 8; i++)
- t[v][i] = t[v<<1][i] + t[v<<1|1][i];
- }
- int get (int v, int tl, int tr, int l, int r, int val) {
- push(v);
- if (l > r || t[v][val] == 0)
- return LLONG_MAX;
- if (tl == tr) {
- return tl;
- }
- int tm = (tl + tr)>>1;
- int cur = get (v<<1, tl, tm, l, min(r, tm), val);
- if (cur != LLONG_MAX)
- return cur;
- return get(v<<1|1, tm + 1, tr, max(tm + 1, l), r, val);
- }
- int get (int left, int right) {
- int last[8][8];
- for (auto & i : last) {
- for (auto & j : i)
- j = LLONG_MAX;
- }
- for (int i = 0; i <= 7; i++) {
- last[0][i] = get(1, 0, n - 1, left, right, i);
- if (i > 0)
- last[0][i] = min(last[0][i], last[0][i - 1]);
- }
- for (int len = 1; len <= 7; len++) {
- for (int j = len; j <= 7; j++) {
- last[len][j] = min(get(1, 0, n - 1, last[len - 1][j - 1], right, j), last[len][j - 1]);
- }
- }
- for (int len = 7; len > -1; len--) {
- for (int i = 0; i <= 7; i++) {
- if (last[len][i] != LLONG_MAX)
- return len + 1;
- }
- }
- return 1;
- }
- int32_t main() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- int q;
- cin >> n >> q;
- for (int i = 0; i < n; i++) {
- cin >> a[i];
- }
- build(1, 0, n - 1);
- while (q--) {
- string tp;
- cin >> tp;
- if (tp == "xor") {
- int l, r, x;
- cin >> l >> r >> x;
- l--, r--;
- update(1, 0, n - 1, l, r, x);
- } else {
- int l, r;
- cin >> l >> r;
- l--, r--;
- cout << get(l, r) << '\n';
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment