#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 1e6 + 5;
struct Node;
Node *newNode();
long long A[MAXN * 2];
struct Node {
  Node *pl, *pr, *par;
  long long nl = 0, nr = 0;
  long long rsum = 0;
  long long val = 0;
  long long amtR = 0;
  void updateVal() {
    long long amtAdded = min(pl->rsum, (pr->nr - pr->nl) - pr->val);
    amtR = amtAdded;
    val = pl->val + pr->val + amtAdded;
    rsum = pr->rsum + pl->rsum - amtAdded;
  }
  void build(long long l, long long r) {
    nl = l, nr = r;
    if (nl + 1 == nr) {
      val = A[nl];
      return;
    }
    (pl = newNode())->build(nl, nl + nr >> 1);
    (pr = newNode())->build(nl + nr >> 1, nr);
    pl->par = this;
    pr->par = this;
    updateVal();
  }
  void add(long long p, long long x) {
    if (p < nl || nr <= p) {
      return;
    }
    if (nl + 1 == nr) {
      val = 1;
      rsum = x - 1;
      A[nl] = x;
      return;
    }
    pl->add(p, x);
    pr->add(p, x);
    updateVal();
  }
  void erase(long long p) {
    if (p < nl || nr <= p) {
      return;
    }
    if (nl + 1 == nr) {
      val = 0;
      rsum = 0;
      A[nl] = 0;
      return;
    }
    pl->erase(p);
    pr->erase(p);
    updateVal();
  }
  long long query(long long l, long long r, long long csum) {
    if (nl >= l && nr <= r) {
      if (val + csum <= nr - nl) {
        return rsum;
      } else if (val + csum >= nr - nl) {
        return rsum + csum - ((nr - nl) - val);
      }
      assert(false);
    }
    if (l >= nr || nl >= r) return csum;
    long long res = pl->query(l, r, csum);
    long long ans = pr->query(l, r, res);
    return ans;
  }
};
long long bufSize = MAXN * 2;
Node buf[MAXN * 2];
Node *newNode() { return &buf[--bufSize]; }
Node *seg = newNode();
long long Q;
unordered_map<long long, long long> maps;
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  seg->build(0, MAXN);
  cin >> Q;
  for (long long i = 0; i < Q; i++) {
    char t;
    cin >> t;
    if (t == '?') {
      long long x;
      cin >> x;
      long long res = seg->query(0, x, 0);
      cout << res + A[x] << endl;
    } else if (t == '+') {
      long long x, v;
      cin >> x >> v;
      seg->add(x, v);
      maps[i + 1] = x;
    } else if (t == '-') {
      long long idx;
      cin >> idx;
      seg->erase(maps[idx]);
      maps.erase(idx);
    }
  }
}
