#include <bits/stdc++.h>
using namespace std;
long long N = 1000000007;
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long binpow(long long a, int n) {
  if (!n) return 1;
  if (n % 2) return binpow(a, n - 1) * a % N;
  long long bp = binpow(a, n / 2);
  return bp * bp % N;
}
vector<pair<long long, long long> > segtree;
long long segt(int v, long long a, int l, int r, int tl, int tr) {
  if (l > r) return N;
  if (l == tl && r == tr) {
    segtree[v].second += a;
    return segtree[v].first + segtree[v].second;
  }
  int tm = (tl + tr) / 2;
  segtree[2 * v + 1].second += segtree[v].second;
  segtree[2 * v + 2].second += segtree[v].second;
  long long lef = segt(2 * v + 1, a, l, min(r, tm), tl, tm);
  long long rig = segt(2 * v + 2, a, max(l, tm + 1), r, tm + 1, tr);
  segtree[v].first = min(segtree[2 * v + 1].first + segtree[2 * v + 1].second,
                         segtree[2 * v + 2].first + segtree[2 * v + 2].second);
  segtree[v].second = 0;
  return min(lef, rig);
}
void solve() {
  int n;
  cin >> n;
  set<int> b, f, sb, sf;
  long long ans = 0;
  for (int i = 0; i < n; ++i) {
    int x, y;
    cin >> x >> y;
    ans += y;
    if (x == 0) {
      if (y > 0) {
        f.insert(y);
      } else {
        y = -y;
        if (sf.count(y)) {
          sf.erase(y);
          ans -= y;
        } else {
          f.erase(y);
        }
      }
    } else {
      if (y > 0) {
        b.insert(y);
      } else {
        y = -y;
        if (sb.count(y)) {
          sb.erase(y);
          ans -= y;
        } else {
          b.erase(y);
          if (b.empty()) {
            if (!sb.empty()) {
              ans -= *sb.begin();
              b.insert(*sb.begin());
              sb.erase(sb.begin());
            } else if (!sf.empty()) {
              ans -= *sf.begin();
              f.insert(*sf.begin());
              sf.erase(sf.begin());
            }
          } else if (!sf.empty() || !sb.empty()) {
            int val1 = sf.empty() ? N : *sf.begin(),
                val2 = sb.empty() ? N : *sb.begin();
            if (val1 < val2) {
              sf.erase(val1);
              ans -= val1;
              f.insert(val1);
            } else {
              sb.erase(val2);
              ans -= val2;
              b.insert(val2);
            }
          }
        }
      }
    }
    if (sf.size() < b.size()) {
      if (b.size() == 1) {
        if (!f.empty()) {
          int val = *--f.end();
          sf.insert(val);
          ans += val;
          f.erase(val);
        }
      } else {
        int val1 = *--b.end(), val2 = f.empty() ? -1 : *--f.end();
        ans += max(val1, val2);
        if (val1 > val2) {
          b.erase(val1);
          sb.insert(val1);
        } else {
          f.erase(val2);
          sf.insert(val2);
        }
      }
    }
    for (int j = 0; j < 2; ++j) {
      if (!f.empty() && !sb.empty() && *--f.end() > *sb.begin()) {
        ans -= *sb.begin();
        b.insert(*sb.begin());
        sb.erase(sb.begin());
        int val = *--f.end();
        ans += val;
        f.erase(val);
        sf.insert(val);
      }
      if (!f.empty() && !sf.empty() && *--f.end() > *sf.begin()) {
        ans -= *sf.begin();
        f.insert(*sf.begin());
        sf.erase(sf.begin());
        int val = *--f.end();
        ans += val;
        f.erase(val);
        sf.insert(val);
      }
      if (b.size() > 1 && !sb.empty() && *--b.end() > *sb.begin()) {
        ans -= *sb.begin();
        b.insert(*sb.begin());
        sb.erase(sb.begin());
        int val = *--b.end();
        ans += val;
        b.erase(val);
        sb.insert(val);
      }
      if (b.size() > 1 && !sf.empty() && *--b.end() > *sf.begin()) {
        ans -= *sf.begin();
        f.insert(*sf.begin());
        sf.erase(sf.begin());
        int val = *--b.end();
        ans += val;
        b.erase(val);
        sb.insert(val);
      }
    }
    cout << ans << endl;
  }
}
int main() {
  int tt = 1;
  while (tt--) {
    solve();
  }
  return 0;
}
