Alex_tz307

Miguel și Baza 2

Apr 26th, 2021
561
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.32 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using int64 = long long;
  5.  
  6. void fastIO() {
  7.   ios_base::sync_with_stdio(false);
  8.   cin.tie(nullptr);
  9.   cout.tie(nullptr);
  10. }
  11.  
  12. const int MAXN = 1e5 + 1;
  13. int a[MAXN], p2[18];
  14.  
  15. int64 gauss(int64 x) {
  16.   return (x * (x + 1)) >> 1;
  17. }
  18.  
  19. void solve() {
  20.   int N, Q;
  21.   cin >> N >> Q;
  22.   for (int i = 1; i <= N; ++i)
  23.     cin >> a[i];
  24.   set<pair<int,int>> S[17];
  25.   p2[0] = 1;
  26.   for (int i = 1; i < 18; ++i)
  27.     p2[i] = p2[i - 1] << 1;
  28.   int64 ans = 0;
  29.   for (int bit = 0; bit < 17; ++bit) {
  30.     int st = 0, dr = 0;
  31.     for (int i = 1; i <= N; ++i)
  32.       if (a[i] & p2[bit]) {
  33.         if (st == 0)
  34.           st = dr = i;
  35.         else dr = i;
  36.       } else
  37.         if (st) {
  38.           S[bit].emplace(st, dr);
  39.           ans += gauss(dr - st + 1) * p2[bit];
  40.           st = 0;
  41.         }
  42.     if (st) {
  43.       S[bit].emplace(st, dr);
  44.       ans += gauss(dr - st + 1) * p2[bit];
  45.     }
  46.   }
  47.   for (int q = 0; q < Q; ++q) {
  48.     int p, x;
  49.     cin >> p >> x;
  50.     for (int bit = 0; bit < 17; ++bit) {
  51.       bool s1 = false, s2 = false;
  52.       if (a[p] & p2[bit])
  53.         s1 = true;
  54.       if (x & p2[bit])
  55.         s2 = true;
  56.       if (s1 == s2)
  57.         continue;
  58.       if (s1) {
  59.         auto it = S[bit].upper_bound(make_pair(p, N + 1));
  60.         --it;
  61.         int l = (*it).first, r = (*it).second;
  62.         S[bit].erase(it);
  63.         ans -= gauss(r - l + 1) * p2[bit];
  64.         if (l <= p - 1) {
  65.           S[bit].emplace(l, p - 1);
  66.           ans += gauss(p - l) * p2[bit];
  67.         }
  68.         if (p + 1 <= r) {
  69.           S[bit].emplace(p + 1, r);
  70.           ans += gauss(r - p) * p2[bit];
  71.         }
  72.       } else {
  73.         auto it = S[bit].upper_bound(make_pair(p, 0));
  74.         if (it != S[bit].end() && (*it).first == p + 1) {
  75.           int l2 = (*it).first, r2 = (*it).second;
  76.           if (it != S[bit].begin()) {
  77.             auto prv = it;
  78.             --prv;
  79.             int l1 = (*prv).first, r1 = (*prv).second;
  80.             S[bit].erase(it);
  81.             if (r1 == p - 1) {
  82.               S[bit].erase(prv);
  83.               ans -= gauss(r1 - l1 + 1) * p2[bit];
  84.               ans -= gauss(r2 - l2 + 1) * p2[bit];
  85.               S[bit].emplace(l1, r2);
  86.               ans += gauss(r2 - l1 + 1) * p2[bit];
  87.             } else {
  88.               ans -= gauss(r2 - l2 + 1) * p2[bit];
  89.               l2 = p;
  90.               S[bit].emplace(l2, r2);
  91.               ans += gauss(r2 - l2 + 1) * p2[bit];
  92.             }
  93.           } else {
  94.             S[bit].erase(it);
  95.             ans -= gauss(r2 - l2 + 1) * p2[bit];
  96.             l2 = p;
  97.             S[bit].emplace(l2, r2);
  98.             ans += gauss(r2 - l2 + 1) * p2[bit];
  99.           }
  100.         } else {
  101.           if (it != S[bit].begin()) {
  102.             --it;
  103.             int l = (*it).first, r = (*it).second;
  104.             if (r == p - 1) {
  105.               S[bit].erase(it);
  106.               ans -= gauss(r - l + 1) * p2[bit];
  107.               r = p;
  108.               S[bit].emplace(l, r);
  109.               ans += gauss(r - l + 1) * p2[bit];
  110.             } else {
  111.               S[bit].emplace(p, p);
  112.               ans += p2[bit];
  113.             }
  114.           } else {
  115.             S[bit].emplace(p, p);
  116.             ans += p2[bit];
  117.           }
  118.         }
  119.       }
  120.     }
  121.     a[p] = x;
  122.     cout << ans << '\n';
  123.   }
  124. }
  125.  
  126. int main() {
  127.   fastIO();
  128.   solve();
  129.   return 0;
  130. }
  131.  
Advertisement
Add Comment
Please, Sign In to add comment