func_code_string: #include <bits/stdc++.h>   #pragma GCC optimize( Ofast )   using namespace std;   long long S[500005];   void add(int first, int a) {     for (int i = first; i < 500005; i += i & -i) {       S[i] += a;     }   }   long long query(int first) {     long long res = 0;     for (int i = first; i > 0; i -= i & -i) {       res += S[i];     }     return res;   }   struct node {     node *l, *r;     int a, b;     long long Min;     long long tag;     node(int _a, int _b) : l(NULL), r(NULL) {       a = _a;       b = _b;       Min = 1e18;       tag = 0;     }   } * root;   void build(node *n) {     if (n->a == n->b) return;     int mid = (n->a + n->b) / 2;     n->l = new node(n->a, mid);     n->r = new node(mid + 1, n->b);     build(n->l);     build(n->r);   }   long long Min(node *n) { return n->Min + n->tag; }   void pull(node *n) { n->Min = min(Min(n->l), Min(n->r)); }   void push(node *n) {     n->l->tag += n->tag;     n->r->tag += n->tag;     n->tag = 0;   }   void Set(node *n, int first, long long k) {     if (n->a == n->b) {       n->Min = k;       n->tag = 0;       return;     }     push(n);     int mid = (n->a + n->b) / 2;     if (first <= mid)       Set(n->l, first, k);     else       Set(n->r, first, k);     pull(n);   }   void add(node *n, int l, int r, int k) {     if (n->a >= l && n->b <= r) {       n->tag += k;       return;     }     if (n->b < l || n->a > r) return;     push(n);     add(n->l, l, r, k);     add(n->r, l, r, k);     pull(n);   }   int loc[500005];   map<int, vector<int> > qu;   int dfs(node *n) {     if (Min(n) >= 0) {       return 0;     }     if (n->a == n->b) return 1;     push(n);     int ret = dfs(n->l) + dfs(n->r);     pull(n);     return ret;   }   int main() {     int q;     scanf( %d , &q);     vector<pair<char, int> > v;     v.push_back(make_pair(( + ), (0)));     vector<pair<int, int> > num;     num.push_back(make_pair((0), (0)));     for (int i = 1; i <= q; i++) {       char c;       int first;       scanf(  %c %d , &c, &first);       v.push_back(make_pair((c), (first)));       if (c ==  + ) num.push_back(make_pair((first), (i)));     }     sort(num.begin(), num.end());     for (int i = 1; i < num.size(); i++) {       loc[num[i].second] = i;       qu[num[i].first].push_back(i);     }     for (auto &it : qu) {       reverse(it.second.begin(), it.second.end());     }     root = new node(1, num.size() - 1);     int R = num.size() - 1;     build(root);     int sum = 0;     for (int i = 1; i <= q; i++) {       char c;       c = v[i].first;       if (c ==  + ) {         sum++;         int first;         first = v[i].second;         int Index = loc[i];         long long val = query(Index - 1) * 2 - first;         add(root, Index + 1, R, first * 2);         Set(root, Index, val);         add(Index, first);       } else {         sum--;         int first;         first = v[i].second;         int Index = qu[first].back();         qu[first].pop_back();         add(root, Index + 1, R, -first * 2);         Set(root, Index, 1e18);         add(Index, -first);       }       printf( %d n , sum - dfs(root));     }   }   