#include <bits/stdc++.h>
using namespace std;
struct node {
  long long total, sisa;
};
node st[8000000];
void build(long long x, long long l, long long r) {
  if (l == r) {
    st[x].total = 0;
    st[x].sisa = 0;
    return;
  }
  long long mid = (l + r) / 2;
  build(x * 2, l, mid);
  build(x * 2 + 1, mid + 1, r);
  long long len = r - mid;
  if (st[x * 2].sisa + st[x * 2 + 1].total - len > st[x * 2 + 1].sisa) {
    st[x].sisa = st[x * 2].sisa + st[x * 2 + 1].total - len;
  } else
    st[x].sisa = st[x * 2 + 1].sisa;
  st[x].total = st[x * 2].total + st[x * 2 + 1].total;
}
void add(long long x, long long l, long long r, long long idx, long long val) {
  if (l > idx || r < idx) return;
  if (l == r && l == idx) {
    st[x].total += val;
    st[x].sisa += val;
    return;
  }
  long long mid = (l + r) / 2;
  add(x * 2, l, mid, idx, val);
  add(x * 2 + 1, mid + 1, r, idx, val);
  long long len = r - mid;
  if (st[x * 2].sisa + st[x * 2 + 1].total - len > st[x * 2 + 1].sisa) {
    st[x].sisa = st[x * 2].sisa + st[x * 2 + 1].total - len;
  } else
    st[x].sisa = st[x * 2 + 1].sisa;
  st[x].total = st[x * 2].total + st[x * 2 + 1].total;
}
void cancel(long long x, long long l, long long r, long long idx,
            long long val) {
  if (l > idx || r < idx) return;
  if (l == r && l == idx) {
    st[x].total -= val;
    st[x].sisa -= val;
    return;
  }
  long long mid = (l + r) / 2;
  cancel(x * 2, l, mid, idx, val);
  cancel(x * 2 + 1, mid + 1, r, idx, val);
  long long len = r - mid;
  if (st[x * 2].sisa + st[x * 2 + 1].total - len > st[x * 2 + 1].sisa) {
    st[x].sisa = st[x * 2].sisa + st[x * 2 + 1].total - len;
  } else
    st[x].sisa = st[x * 2 + 1].sisa;
  st[x].total = st[x * 2].total + st[x * 2 + 1].total;
}
node query(long long x, long long l, long long r, long long ll, long long rr) {
  if (l > rr || r < ll) {
    node temp;
    temp.sisa = 0;
    temp.total = r - l + 1;
    return temp;
  }
  if (l >= ll && r <= rr) {
    return st[x];
  }
  long long mid = (l + r) / 2;
  node le = query(x * 2, l, mid, ll, rr);
  node ri = query(x * 2 + 1, mid + 1, r, ll, rr);
  node ret;
  long long len = r - mid;
  if (le.sisa + ri.total - len > ri.sisa) {
    ret.sisa = le.sisa + ri.total - len;
  } else
    ret.sisa = ri.sisa;
  ret.total = le.total + ri.total;
  return ret;
}
long long knet[1000100];
long long cost[1000100];
int main() {
  long long n;
  scanf("%lld", &n);
  build(1, 1, 1000000);
  long long asd = 1;
  while (n--) {
    char c;
    getchar();
    scanf("%c", &c);
    if (c == '?') {
      long long x;
      scanf("%lld", &x);
      printf("%lld\n", query(1, 1, 1000000, 1, x).sisa);
    } else if (c == '+') {
      long long x, y;
      scanf("%lld %lld", &x, &y);
      add(1, 1, 1000000, x, y);
      knet[asd] = x;
      cost[asd] = y;
    } else {
      long long x;
      scanf("%lld", &x);
      cancel(1, 1, 1000000, knet[x], cost[x]);
    }
    asd++;
  }
}
