Advertisement
mfgnik

Untitled

Jul 7th, 2020
1,067
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.66 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct fenvik {
  6.     int n;
  7.     vector <int> t;
  8.     fenvik() {}
  9.     fenvik(int n) : n(n), t(vector <int> (n)) {}
  10.     void add(int i, int val) {
  11.         if (i < 0) return;
  12.         while (i < n) {
  13.             t[i] += val;
  14.             i |= i + 1;
  15.         }
  16.         return;
  17.     }
  18.     int pref(int i) {
  19.         int res = 0;
  20.         while (i >= 0) {
  21.             res += t[i];
  22.             i = (i & (i + 1)) - 1;
  23.         }
  24.         return res;
  25.     }
  26.     int sum(int l, int r) {
  27.         return pref(r) - pref(l - 1);
  28.     }
  29. };
  30.  
  31. const int N = 2e5 + 100, Q = 2e5 + 100;
  32.  
  33. int open[N], close[N], pref_black[Q], query[Q], addX[N], addY[N];
  34.  
  35. int main() {
  36.     ios_base::sync_with_stdio(false);
  37.     cin.tie(NULL);
  38.     cout.tie(NULL);
  39.     int n, q, added = 0;
  40.     cin >> n >> q;
  41.     fill_n(open, n, -1);
  42.     fill_n(close, n, -1);
  43.     for (int i = 0; i < q; i++) {
  44.         string z;
  45.         int t;
  46.         cin >> z >> t; t--;
  47.         query[i] = t;
  48.         if (z == "add") {
  49.             open[t] = i;
  50.             added++;
  51.         } else {
  52.             close[t] = i;
  53.         }
  54.     }
  55.  
  56.     fenvik tree = fenvik(q), treeRed = fenvik(q);
  57.     for (int i = 0; i < q; i++) {
  58.         int t = query[i];
  59.         if (open[t] == i && close[t] != -1) {
  60.             addY[t] += pref_black[i];
  61.         }
  62.         if (close[t] == i) {
  63.             addY[t] += tree.sum(0, open[t] - 1);
  64.             addX[t] += treeRed.pref(open[t]);
  65.         }
  66.  
  67.         pref_black[i + 1] = pref_black[i];
  68.         if (open[t] == i && close[t] == -1) {
  69.             pref_black[i + 1]++;
  70.         }
  71.         if (close[t] == i) {
  72.             tree.add(open[t], -1);
  73.             treeRed.add(i + 1, -1);
  74.             treeRed.add(open[t], 1);
  75.         }
  76.         if (close[t] != -1 && open[t] == i) {
  77.             tree.add(i, 1);
  78.         }
  79.     }
  80.  
  81.     long long ans = 0;
  82.     for (int i = 0; i < n; i++) {
  83.         if (close[i] != -1) ans += min(addX[i], addY[i]) * 2 + 1;
  84.     }
  85.     ans += added;
  86.     cout << ans << '\n';
  87.     return 0;
  88. }
  89. ф
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement