#include <bits/stdc++.h>
using namespace std;
namespace IO {
template <class T>
inline void read(T &x) {
  x = 0;
  int f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch <= '9' && ch >= '0') x = x * 10 + ch - '0', ch = getchar();
  x *= f;
}
};  // namespace IO
using namespace IO;
const int N = 1000005;
int Q, n = 1e6, x[N];
long long y[N];
char opt;
struct T {
  int L, R;
  long long max, lazy;
} t[N << 2];
long long tt[N];
void pushup(int pos) { t[pos].max = max(t[pos << 1].max, t[pos << 1 | 1].max); }
void build(int pos, int L, int R) {
  t[pos].L = L, t[pos].R = R;
  if (L == R) {
    t[pos].max = 1LL * L;
    return;
  }
  int mid = (L + R) >> 1;
  build(pos << 1, L, mid);
  build(pos << 1 | 1, mid + 1, R);
  pushup(pos);
}
void pushdown(int pos) {
  if (t[pos].lazy) {
    t[pos << 1].lazy += t[pos].lazy;
    t[pos << 1 | 1].lazy += t[pos].lazy;
    t[pos << 1].max += t[pos].lazy;
    t[pos << 1 | 1].max += t[pos].lazy;
    t[pos].lazy = 0;
  }
}
void add(int pos, int L, int R, int y) {
  if (L <= t[pos].L && t[pos].R <= R) {
    t[pos].lazy += y;
    t[pos].max += y;
    return;
  }
  if (L > t[pos].R || R < t[pos].L) return;
  pushdown(pos);
  add(pos << 1, L, R, y);
  add(pos << 1 | 1, L, R, y);
  pushup(pos);
}
const long long INF = 1e18;
long long query(int pos, int L, int R) {
  if (L <= t[pos].L && t[pos].R <= R) {
    return t[pos].max;
  }
  if (L > t[pos].R || R < t[pos].L) return -INF;
  pushdown(pos);
  return max(query(pos << 1, L, R), query(pos << 1 | 1, L, R));
}
int lowbit(int x) { return x & -x; }
void addt(int x, long long y) {
  while (x <= n) {
    tt[x] += y, x += lowbit(x);
  }
}
long long queryt(int x) {
  long long res = 0;
  while (x > 0) {
    res += tt[x], x -= lowbit(x);
  }
  return res;
}
void Add(int x, long long y) {
  addt(x, y);
  add(1, x + 1, n, -y);
}
void Query(int x) { cout << queryt(x) + query(1, 1, x) - x << '\n'; }
int main() {
  scanf("%d\n", &Q);
  build(1, 1, n);
  for (int i = (1); i <= (Q); ++i) {
    scanf("%c", &opt);
    if (opt == '+') {
      scanf("%d %lld\n", &x[i], &y[i]);
      Add(x[i], y[i]);
    }
    int temp;
    if (opt == '-') {
      scanf("%d\n", &temp);
      Add(x[temp], -y[temp]);
    }
    if (opt == '?') {
      scanf("%d\n", &temp);
      Query(temp);
    }
  }
  return 0;
}
