#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));
  }
}
