Advertisement
wym1111

Untitled

Jun 10th, 2024
457
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.11 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5. using ll = long long;
  6. #define endl '\n'
  7. const int N = 2e5 + 10;
  8.  
  9. const int sz = 30;
  10. const int INF = 0x3f3f3f3f;
  11. class Segment {
  12. private:
  13.     struct Node {
  14.         int sum[sz];
  15.         int minst, minnd;
  16.         int minnum;
  17.     } node[N << 2];
  18.     int a[N], n;
  19. public:
  20.     void init (int _n, int b[N]) {
  21.         n = _n;
  22.         for (int i = 1; i <= n; i ++) {
  23.             a[i] = b[i];
  24.         }
  25.     }
  26.     void push_up (int p) {
  27.         int ls = p << 1, rs = p << 1 | 1;
  28.         for (int i = 0; i < sz; i ++) {
  29.             node[p].sum[i] = node[ls].sum[i] + node[rs].sum[i];
  30.         }
  31.         if (node[ls].minst == node[rs].minst) {
  32.             node[p].minnum = node[ls].minnum + node[rs].minnum;
  33.             node[p].minnd = min(node[ls].minnd, node[rs].minnd);
  34.         }
  35.         if (node[ls].minst < node[rs].minst) {
  36.             node[p].minst = node[ls].minst;
  37.             node[p].minnum = node[ls].minnum;
  38.             node[p].minnd = min(node[ls].minnd, node[rs].minst);
  39.         }
  40.         if (node[ls].minst > node[rs].minst) {
  41.             node[p].minst = node[rs].minst;
  42.             node[p].minnum = node[rs].minnum;
  43.             node[p].minnd = min(node[ls].minst, node[rs].minnd);
  44.         }
  45.     }
  46.     void build (int s, int t, int p) {
  47.         if (s == t) {
  48.             for (int i = 0; i < sz; i ++) {
  49.                 node[p].sum[i] = (a[s] >> i) & 1;
  50.             }
  51.             node[p].minst = a[s];
  52.             node[p].minnd = INF;
  53.             node[p].minnum = 1;
  54.         }
  55.         int mid = (s + t) >> 1;
  56.         build(s, mid, p << 1);
  57.         build(mid + 1, t, p << 1 | 1);
  58.         push_up(p);
  59.     }
  60.     void push_down (int p) {
  61.        
  62.     }
  63.     void update (int l, int r, int x, int s, int t, int p) {
  64.         if (x <= node[p].minst) return;
  65.         if (x < node[p].minnd) {
  66.             for (int i = 0; i < sz; i ++) {
  67.                 if ((node[p].minst >> i) & 1) {
  68.                     node[p].sum[i] -= node[p].minnum;
  69.                 }
  70.                 if ((x >> i) & 1) {
  71.                     node[p].sum[i] += node[p].minnum;
  72.                 }
  73.             }
  74.             node[p].minst = x;
  75.             return;
  76.         }
  77.         push_down(p);
  78.         int mid = (s + t) >> 1;
  79.         if (l <= mid) update(l, r, x, s, mid, p << 1);
  80.         if (mid < r) update(l, r, x, mid + 1, t, p << 1 | 1);
  81.         push_up(p);
  82.     }
  83.     int query (int l, int r, int x, int s, int t, int p) {
  84.         if (l <= s && t <= r) {
  85.             return node[p].sum[x];
  86.         }
  87.         push_down(p);
  88.         int mid = (s + t) >> 1;
  89.         int res = 0;
  90.         if (l <= mid) res = query(l, r, x, s, mid, p << 1);
  91.         if (mid < r) res += query(l, r, x, mid + 1, t, p << 1 | 1);
  92.         push_up(p);
  93.         return res;
  94.     }
  95.     int getxor (int l, int r, int s, int t, int p) {
  96.         if (l <= s && t <= r) {
  97.             int res = 0;
  98.             for (int i = 0; i < sz; i ++) {
  99.                 if (node[p].sum[i] & 1) res |= (1 << i);
  100.             }
  101.             return res;
  102.         }
  103.         push_down(p);
  104.         int mid = (s + t) >> 1;
  105.         int res = 0;
  106.         if (l <= mid) res = getxor(l, r, s, mid, p << 1);
  107.         if (mid < r) res ^= getxor(l, r, mid + 1, t, p << 1 | 1);
  108.         push_up(p);
  109.         return res;
  110.     }
  111. };
  112. Segment seg;
  113.  
  114. int n, q;
  115. int a[N];
  116.  
  117. void solve() {
  118.     cin >> n >> q;
  119.     for (int i = 1; i <= n; i ++) {
  120.         cin >> a[i];
  121.     }
  122.     seg.init(n, a);
  123.     seg.build(1, n, 1);
  124.     while (q --) {
  125.         int opt, l, r, x;
  126.         cin >> opt >> l >> r >> x;
  127.         if (opt == 1) {
  128.            
  129.         } else {
  130.            
  131.         }
  132.     }
  133. }
  134.  
  135. signed main() {
  136.     ios::sync_with_stdio(false);
  137.     cin.tie(nullptr);
  138.    
  139.     int _ = 1;
  140. //  cin >> _;
  141.     while(_--)
  142.         solve();
  143.     return 0;
  144. }
  145.  
  146. /*
  147.  
  148.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement