#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
long long M[maxn << 2], tag[maxn << 2];
void gather(int p) { M[p] = max(M[p << 1], M[p << 1 | 1]); }
void push(int p) {
  if (tag[p]) {
    tag[p << 1] += tag[p];
    tag[p << 1 | 1] += tag[p];
    M[p << 1] += tag[p];
    M[p << 1 | 1] += tag[p];
    tag[p] = 0;
  }
}
void modify(int p, int tl, int tr, int l, int r, long long v) {
  if (tr < l || r < tl) return;
  if (l <= tl && tr <= r) {
    tag[p] += v;
    M[p] += v;
    return;
  }
  push(p);
  int mid = (tl + tr) >> 1;
  modify(p << 1, tl, mid, l, r, v);
  modify(p << 1 | 1, mid + 1, tr, l, r, v);
  gather(p);
}
long long query(int p, int tl, int tr, int l, int r) {
  if (tr < l || r < tl) return 0ll;
  if (l <= tl && tr <= r) return M[p];
  push(p);
  int mid = (tl + tr) >> 1;
  long long ret = query(p << 1, tl, mid, l, r);
  ret = max(ret, query(p << 1 | 1, mid + 1, tr, l, r));
  return ret;
}
long long c[maxn];
inline int lowbit(int s) { return s & (-s); }
inline void modify(int i, long long x) {
  while (i < maxn) c[i] += x, i += lowbit(i);
}
inline long long query(int i) {
  long long ret = 0;
  while (i > 0) ret += c[i], i -= lowbit(i);
  return ret;
}
long long x[maxn], y[maxn];
int main() {
  int q;
  scanf("%d", &q);
  for (int t = 1; t <= q; ++t) {
    char op[11];
    scanf("%s %lld", op, x + t);
    if (op[0] == '+') {
      scanf("%lld", y + t);
      modify(1, 1, 1000000, x[t], x[t], x[t]);
      modify(1, 1, 1000000, 1, x[t], y[t]);
      modify(x[t], y[t]);
    } else if (op[0] == '-') {
      modify(1, 1, 1000000, x[x[t]], x[x[t]], -x[x[t]]);
      modify(1, 1, 1000000, 1, x[x[t]], -y[x[t]]);
      modify(x[x[t]], -y[x[t]]);
    } else {
      long long tmp =
          query(1, 1, 1000000, 1, x[t]) - (query(1000000) - query(x[t]));
      printf("%lld\n", max(x[t], tmp) - x[t]);
    }
  }
  return 0;
}
