ProgMe

Untitled

Dec 3rd, 2023
705
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define int int64_t
  4.  
  5. using namespace std;
  6.  
  7. const int N = 1e5 + 15;
  8.  
  9. int n;
  10.  
  11. int a[N];
  12. int lazy[N * 4];
  13. int t[N * 4][8];
  14.  
  15. void recalc (int v, int val) {
  16.     int cnt[8]{};
  17.     for (int i = 0; i < 8; i++) {
  18.         cnt[i ^ val] = t[v][i];
  19.     }
  20.     for (int i = 0; i < 8; i++)
  21.         t[v][i] = cnt[i];
  22. }
  23.  
  24. void push (int v) {
  25.     if ((v<<1|1) < 400'004 && lazy[v]) {
  26.        lazy[v<<1|1] ^= lazy[v];
  27.        lazy[v<<1] ^= lazy[v];
  28.        recalc(v<<1, lazy[v]);
  29.        recalc(v<<1|1, lazy[v]);
  30.        lazy[v] = 0;
  31.    }
  32. }
  33.  
  34. void build (int v, int tl, int tr) {
  35.    if (tl == tr) {
  36.        t[v][a[tl]] = 1;
  37.        return;
  38.    }
  39.    int tm = (tl + tr)>>1;
  40.    build(v<<1, tl, tm);
  41.    build(v<<1|1, tm + 1, tr);
  42.    for (int i = 0; i < 8; i++)
  43.        t[v][i] = t[v<<1][i] + t[v<<1|1][i];
  44. }
  45.  
  46. void update (int v, int tl, int tr, int l, int r, int val) {
  47.    if (l > r) {
  48.        return;
  49.    }
  50.    push(v);
  51.    if (l == tl && r == tr) {
  52.        recalc(v, val);
  53.        lazy[v] = val;
  54.        return;
  55.    }
  56.    int tm = (tl + tr)>>1;
  57.    update(v<<1, tl, tm, l, min(r, tm), val);
  58.    update(v<<1|1, tm + 1, tr, max(l, tm + 1), r, val);
  59.    for (int i = 0; i < 8; i++)
  60.        t[v][i] = t[v<<1][i] + t[v<<1|1][i];
  61. }
  62.  
  63. int get (int v, int tl, int tr, int l, int r, int val) {
  64.    push(v);
  65.    if (l > r || t[v][val] == 0)
  66.        return LLONG_MAX;
  67.    if (tl == tr) {
  68.        return tl;
  69.    }
  70.    int tm = (tl + tr)>>1;
  71.    int cur = get (v<<1, tl, tm, l, min(r, tm), val);
  72.    if (cur != LLONG_MAX)
  73.        return cur;
  74.    return get(v<<1|1, tm + 1, tr, max(tm + 1, l), r, val);
  75. }
  76.  
  77. int get (int left, int right) {
  78.    int last[8][8];
  79.    for (auto & i : last) {
  80.        for (auto & j : i)
  81.            j = LLONG_MAX;
  82.    }
  83.    for (int i = 0; i <= 7; i++) {
  84.        last[0][i] = get(1, 0, n - 1, left, right, i);
  85.        if (i > 0)
  86.            last[0][i] = min(last[0][i], last[0][i - 1]);
  87.    }
  88.    for (int len = 1; len <= 7; len++) {
  89.        for (int j = len; j <= 7; j++) {
  90.            last[len][j] = min(get(1, 0, n - 1, last[len - 1][j - 1], right, j), last[len][j - 1]);
  91.        }
  92.    }
  93.    for (int len = 7; len > -1; len--) {
  94.        for (int i = 0; i <= 7; i++) {
  95.            if (last[len][i] != LLONG_MAX)
  96.                return len + 1;
  97.        }
  98.    }
  99.    return 1;
  100. }
  101.  
  102. int32_t main() {
  103.    ios::sync_with_stdio(false);
  104.    cin.tie(nullptr);
  105.    int q;
  106.    cin >> n >> q;
  107.    for (int i = 0; i < n; i++) {
  108.        cin >> a[i];
  109.    }
  110.    build(1, 0, n - 1);
  111.    while (q--) {
  112.        string tp;
  113.        cin >> tp;
  114.        if (tp == "xor") {
  115.            int l, r, x;
  116.            cin >> l >> r >> x;
  117.            l--, r--;
  118.            update(1, 0, n - 1, l, r, x);
  119.        } else {
  120.            int l, r;
  121.            cin >> l >> r;
  122.            l--, r--;
  123.            cout << get(l, r) << '\n';
  124.        }
  125.    }
  126. }
Advertisement
Add Comment
Please, Sign In to add comment