#include <bits/stdc++.h>
using namespace std;
template <typename T>
ostream& operator<<(ostream& s, vector<T> const& v) {
  s << '{';
  for (int i = 0; i < int(v.size()); i++) s << (i ? "," : "") << v[i];
  return s << '}';
}
template <typename S, typename T>
ostream& operator<<(ostream& s, pair<S, T> const& p) {
  return s << '(' << p.first << ',' << p.second << ')';
}
struct node {
  long long mx = 0, add = 0;
  void apply(long long x) {
    add += x;
    mx += x;
  }
  void split(node& ls, node& rs) {
    ls.apply(add);
    rs.apply(add);
    add = 0;
  }
  void merge(node& ls, node& rs) { mx = max(ls.mx, rs.mx); }
};
vector<int> xs;
vector<node> seg;
void segBuild(int n, int l, int r) {
  if (l == r) {
    seg[n].mx = xs[l];
    return;
  }
  int m = (l + r) / 2;
  segBuild(2 * n + 1, l, m);
  segBuild(2 * n + 2, m + 1, r);
  seg[n].merge(seg[2 * n + 1], seg[2 * n + 2]);
}
node segQuery(int n, int l, int r, int i, int j) {
  if (i <= l && r <= j) return seg[n];
  int m = (l + r) / 2;
  seg[n].split(seg[2 * n + 1], seg[2 * n + 2]);
  if (m < i) return segQuery(2 * n + 2, m + 1, r, i, j);
  if (m >= j) return segQuery(2 * n + 1, l, m, i, j);
  node ls = segQuery(2 * n + 1, l, m, i, j);
  node rs = segQuery(2 * n + 2, m + 1, r, i, j);
  node a;
  a.merge(ls, rs);
  return a;
}
void segUpdate(int n, int l, int r, int i, int j, long long x) {
  if (i > r || j < l) return;
  if (i <= l && r <= j) {
    seg[n].apply(x);
    return;
  }
  int m = (l + r) / 2;
  seg[n].split(seg[2 * n + 1], seg[2 * n + 2]);
  segUpdate(2 * n + 1, l, m, i, j, x);
  segUpdate(2 * n + 2, m + 1, r, i, j, x);
  seg[n].merge(seg[2 * n + 1], seg[2 * n + 2]);
}
struct EV {
  char c;
  int a, b;
};
int main() {
  int Q;
  scanf("%d", &Q);
  vector<EV> evts(Q);
  for (int q = 0; q < int(Q); q++) {
    auto& e = evts[q];
    scanf(" %c", &e.c);
    if (e.c == '+') {
      scanf("%d%d", &e.a, &e.b);
      xs.push_back(e.a);
    } else
      scanf("%d", &e.a);
  }
  sort(begin(xs), end(xs));
  xs.erase(unique(begin(xs), end(xs)), xs.end());
  int N = ((int)(xs).size());
  seg.resize(4 * N);
  segBuild(0, 0, N - 1);
  for (EV const& e : evts) {
    if (e.c == '+') {
      int i = int(lower_bound(begin(xs), end(xs), e.a) - begin(xs));
      segUpdate(0, 0, N - 1, 0, i, e.b);
    } else if (e.c == '-') {
      EV const& e2 = evts[e.a - 1];
      int i = int(lower_bound(begin(xs), end(xs), e2.a) - begin(xs));
      segUpdate(0, 0, N - 1, 0, i, -e2.b);
    } else if (e.c == '?') {
      long long pr = 0;
      int i = int(upper_bound(begin(xs), end(xs), e.a) - begin(xs)) - 1;
      if (i >= 0) {
        pr = segQuery(0, 0, N - 1, 0, i).mx;
        if (i + 1 < N) {
          pr -= segQuery(0, 0, N - 1, i + 1, i + 1).mx - xs[i + 1];
        }
      }
      printf("%lld\n", max(0LL, pr - e.a));
    }
  }
}
