#include <bits/stdc++.h>
using ll = long long;
using ull = unsigned long long;
using uint = unsigned int;
using ld = long double;
using vi = std::vector<int>;
using pii = std::pair<int, int>;
using vvi = std::vector<vi>;
using vii = std::vector<pii>;
using vll = std::vector<ll>;
using pll = std::pair<ll, ll>;
template <typename T>
int sign(const T& t) {
  return (t > 0) - (t < 0);
}
template <typename T, typename U>
bool remax(T& a, U b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T, typename U>
bool remin(T& a, U b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
T gcd(T a, T b) {
  a = std::abs(a);
  b = std::abs(b);
  while (b) {
    a %= b;
    std::swap(a, b);
  }
  return a;
}
template <typename T>
T lcm(T a, T b) {
  a = std::abs(a);
  b = std::abs(b);
  return a / gcd(a, b) * b;
}
double get_time() { return static_cast<double>(clock()) / CLOCKS_PER_SEC; }
long long current_nanoseconds() {
  return std::chrono::steady_clock::now().time_since_epoch().count();
}
long long default_seed = current_nanoseconds();
uint32_t mrand_32t() {
  static std::mt19937 rng(default_seed);
  return rng();
}
uint64_t mrand_64t() {
  static std::mt19937_64 rng(default_seed);
  return rng();
}
template <typename T>
void make_unique(std::vector<T>& v) {
  std::sort(std::begin(v), std::end(v));
  v.erase(std::unique(std::begin(v), std::end(v)), std::end(v));
}
namespace std {
template <typename A, typename B>
string to_string(const pair<A, B>& p) {
  string str;
  str += "(";
  str += to_string(p.first);
  str += ", ";
  str += to_string(p.second);
  str += ")";
  return str;
}
string to_string(bool value) { return value ? "true" : "false"; }
template <typename T>
string to_string(const vector<T>& vec) {
  string str = "{ ";
  bool first = true;
  for (const auto& it : vec) {
    if (!first) {
      str += ", ";
    }
    str += to_string(it);
    first = false;
  }
  str += " }";
  return str;
}
template <typename T>
string to_string(const set<T>& s) {
  string str = "{ ";
  bool first = true;
  for (const auto& it : s) {
    if (!first) {
      str += ", ";
    }
    str += to_string(it);
    first = false;
  }
  str += " }";
  return str;
}
template <typename K, typename V>
string to_string(const map<K, V>& m) {
  string str = "{ ";
  bool first = true;
  for (const auto& it : m) {
    if (!first) {
      str += ", ";
    }
    first = false;
    str += to_string(it.first);
    str += " -> ";
    str += to_string(it.second);
  }
  str += " }";
  return str;
}
string to_string(const string& s) { return "\"" + s + "\""; }
string to_string(const char* s) { return to_string(string(s)); }
string to_string(char ch) { return "\'" + string(1, ch) + "\'"; }
template <size_t N>
string to_string(const bitset<N>& b) {
  string res(N, '0');
  for (size_t i = 0; i < N; ++i) {
    res[i] = '0' + b[i];
  }
  return res;
}
template <typename T>
string to_string(const T& t) {
  std::stringstream ss;
  ss << t;
  return ss.str();
}
}  // namespace std
void debug_out() { std::cerr << std::endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  std::cerr << " " << std::to_string(H);
  debug_out(T...);
}
using namespace std;
struct query {
  int x;
  char type;
  bool read() {
    if (!(cin >> type >> x)) {
      return 0;
    }
    return 1;
  }
};
vector<query> qs;
bool read() {
  int q;
  if (!(cin >> q)) {
    return 0;
  }
  qs.resize(q);
  for (int i = int(0); i < int(q); ++i) {
    assert(qs[i].read());
  }
  return 1;
}
struct block {
  multiset<int> vals;
  ll sum;
  block() { sum = 0; }
  void insert(int x) {
    sum += x;
    vals.insert(x);
  }
  void remove(int x) {
    sum -= x;
    vals.erase(vals.find(x));
  }
};
static const int B = 31;
void solve() {
  vector<block> blocks;
  for (int k = int(0); k < int(B); ++k) {
    blocks.push_back(block());
  }
  for (const auto& q : qs) {
    const auto x = q.x;
    bool found = 0;
    for (int k = int(0); k < int(B); ++k) {
      if ((1 << (k + 1)) > x) {
        if (q.type == '+') {
          blocks.at(k).insert(x);
        } else {
          blocks.at(k).remove(x);
        }
        found = 1;
        break;
      }
    }
    assert(found);
    ll sum = 0;
    int cnt_alive = 0;
    int cnt_bad = 0;
    for (int k = int(0); k < int(B); ++k) {
      const auto& b = blocks.at(k);
      if (b.vals.empty()) {
        continue;
      }
      int x = *b.vals.begin();
      if (x > 2 * sum) {
        ++cnt_bad;
      }
      cnt_alive += int((b.vals).size());
      sum += b.sum;
    }
    cout << cnt_alive - cnt_bad << "\n";
  }
  cout << endl;
}
int main() {
  cin.tie(nullptr);
  ios_base::sync_with_stdio(false);
  cout.tie(nullptr);
  cout.precision(12);
  cout << fixed;
  while (read()) {
    solve();
  }
  return 0;
}
