#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1);
const int N = 100000 + 5;
long long q;
long long tree[4000005], lazy[4000005];
long long ti[1000005], di[1000005];
void lazify(long long s, long long e, long long i) {
  if (lazy[i]) {
    tree[i] += lazy[i];
    if (s != e) {
      lazy[2 * i] += lazy[i];
      lazy[2 * i + 1] += lazy[i];
    }
    lazy[i] = 0;
  }
}
void upd(long long l, long long r, long long s, long long e, long long i,
         long long x) {
  lazify(s, e, i);
  if (s > r || e < l) return;
  if (s >= l && e <= r) {
    lazy[i] += x;
    lazify(s, e, i);
    return;
  }
  long long mid = (s + e) >> 1;
  upd(l, r, s, mid, 2 * i, x);
  upd(l, r, mid + 1, e, 2 * i + 1, x);
  tree[i] = min(tree[2 * i], tree[2 * i + 1]);
}
long long pquery(long long l, long long r, long long s, long long e,
                 long long i) {
  if (s > r || e < l) return 1e18;
  lazify(s, e, i);
  if (s >= l && e <= r) return tree[i];
  long long mid = (s + e) >> 1;
  return min(pquery(l, r, s, mid, 2 * i), pquery(l, r, mid + 1, e, 2 * i + 1));
}
void build(long long l, long long r, long long i) {
  if (l == r) {
    tree[i] = -l;
    return;
  }
  long long mid = (l + r) >> 1;
  build(l, mid, 2 * i);
  build(mid + 1, r, 2 * i + 1);
  tree[i] = min(tree[2 * i], tree[2 * i + 1]);
}
long long get(long long t) {
  long long x = pquery(t, t, 1, 1000000, 1);
  long long y = pquery(1, t - 1, 1, 1000000, 1);
  y = min(y, 0ll);
  return x - y + 1;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  build(1, 1000000, 1);
  cin >> q;
  for (int i = 1; i <= q; i++) {
    char c;
    long long in;
    cin >> c;
    if (c == '+') {
      cin >> ti[i] >> di[i];
      upd(ti[i], 1000000, 1, 1000000, 1, di[i]);
    } else if (c == '-') {
      cin >> in;
      upd(ti[in], 1000000, 1, 1000000, 1, -di[in]);
    } else if (c == '?') {
      cin >> in;
      cout << get(in) << endl;
    }
  }
}
