Advertisement
kuroni

Untitled

Nov 2nd, 2019
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.06 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. using namespace std;
  5.  
  6. const int LG = 60;
  7. const long long INF = 1E18 + 7;
  8.  
  9. int n;
  10. long long x, y, mi, ans = 0;
  11. long long nb[3];
  12.  
  13. struct element {
  14.     int val;
  15.     long long bit[3];
  16.  
  17.     element(int _val, long long _bit) : val(_val) {
  18.         bit[1] = _bit;
  19.         bit[0] = ((1LL << LG) - 1) ^ _bit;
  20.         bit[2] = 0;
  21.     }
  22.    
  23.     int sig() const {
  24.         return (bit[1] == 0 && bit[2] == 0 ? -1 : __lg(bit[1] | bit[2]));
  25.     }
  26.  
  27.     bool test(int u) {
  28.         return !(bit[0] >> u & 1);
  29.     }
  30.  
  31.     inline void operator^=(const element &oth) {
  32.         if ((bit[1] ^ oth.bit[1]) >> oth.sig() & 1) {
  33.             swap(bit[1], bit[2]);
  34.         }
  35.         nb[0] = (bit[0] & oth.bit[0]) | (bit[1] & oth.bit[1]) | (bit[2] & oth.bit[2]);
  36.         nb[1] = (bit[0] & oth.bit[2]) | (bit[1] & oth.bit[0]) | (bit[2] & oth.bit[1]);
  37.         nb[2] = (bit[0] & oth.bit[1]) | (bit[1] & oth.bit[2]) | (bit[2] & oth.bit[0]);
  38.         bit[0] = nb[0]; bit[1] = nb[1]; bit[2] = nb[2];
  39.     }
  40. };
  41. vector<element> ve;
  42.  
  43. int main() {
  44.     ios_base::sync_with_stdio(false);
  45.     cin.tie(nullptr);
  46.     cin >> n;
  47.     while (n--) {
  48.         cin >> x >> y;
  49.         x ^= ans; y ^= ans;
  50.         element cur = element(y, x);
  51.         int mi = -1;
  52.         for (int i = 0; i < ve.size(); i++) {
  53.             element &v = ve[i];
  54.             if (cur.test(v.sig())) {
  55.                 if (mi == -1 || ve[mi].val > v.val) {
  56.                     mi = i;
  57.                 }
  58.                 cur ^= v;
  59.             }
  60.         }
  61.         if (cur.sig() == -1 && ve[mi].val < cur.val) {
  62.             ans += cur.val - ve[mi].val;
  63.             ve[mi].val = cur.val;
  64.         } else if (cur.sig() >= 0) {
  65.             ans += y;
  66.             ve.push_back(cur);
  67.             for (int i = ve.size() - 1; i > 0; i--) {
  68.                 if (ve[i].bit[0] < ve[i - 1].bit[0]) {
  69.                     swap(ve[i], ve[i - 1]);
  70.                 } else {
  71.                     break;
  72.                 }
  73.             }
  74.         }
  75.         cout << ans << '\n';
  76.     }
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement