Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- struct fenvik {
- int n;
- vector <int> t;
- fenvik() {}
- fenvik(int n) : n(n), t(vector <int> (n)) {}
- void add(int i, int val) {
- if (i < 0) return;
- while (i < n) {
- t[i] += val;
- i |= i + 1;
- }
- return;
- }
- int pref(int i) {
- int res = 0;
- while (i >= 0) {
- res += t[i];
- i = (i & (i + 1)) - 1;
- }
- return res;
- }
- int sum(int l, int r) {
- return pref(r) - pref(l - 1);
- }
- };
- const int N = 2e5 + 100, Q = 2e5 + 100;
- int open[N], close[N], pref_black[Q], query[Q], addX[N], addY[N];
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- cout.tie(NULL);
- int n, q, added = 0;
- cin >> n >> q;
- fill_n(open, n, -1);
- fill_n(close, n, -1);
- for (int i = 0; i < q; i++) {
- string z;
- int t;
- cin >> z >> t; t--;
- query[i] = t;
- if (z == "add") {
- open[t] = i;
- added++;
- } else {
- close[t] = i;
- }
- }
- fenvik tree = fenvik(q), treeRed = fenvik(q);
- for (int i = 0; i < q; i++) {
- int t = query[i];
- if (open[t] == i && close[t] != -1) {
- addY[t] += pref_black[i];
- }
- if (close[t] == i) {
- addY[t] += tree.sum(0, open[t] - 1);
- addX[t] += treeRed.pref(open[t]);
- }
- pref_black[i + 1] = pref_black[i];
- if (open[t] == i && close[t] == -1) {
- pref_black[i + 1]++;
- }
- if (close[t] == i) {
- tree.add(open[t], -1);
- treeRed.add(i + 1, -1);
- treeRed.add(open[t], 1);
- }
- if (close[t] != -1 && open[t] == i) {
- tree.add(i, 1);
- }
- }
- long long ans = 0;
- for (int i = 0; i < n; i++) {
- if (close[i] != -1) ans += min(addX[i], addY[i]) * 2 + 1;
- }
- ans += added;
- cout << ans << '\n';
- return 0;
- }
- ф
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement