#include <bits/stdc++.h>
using namespace std;
struct TREE {
  int tot, L[100010 << 6], R[100010 << 6], S[100010 << 6], rt[100010];
  void add(int pr, int &now, int l, int r, int k, int v) {
    now = ++tot;
    L[now] = L[pr];
    R[now] = R[pr];
    S[now] = S[pr] + v;
    if (l == r) return;
    int mid = l + r >> 1;
    if (k <= mid)
      add(L[pr], L[now], l, mid, k, v);
    else
      add(R[pr], R[now], mid + 1, r, k, v);
  }
  int query(int t, int l, int r, int LL, int RR) {
    if (!t) return 0;
    if (LL <= l && r <= RR) return S[t];
    int mid = l + r >> 1, tmp = 0;
    if (LL <= mid) tmp += query(L[t], l, mid, LL, RR);
    if (RR > mid) tmp += query(R[t], mid + 1, r, LL, RR);
    return tmp;
  }
  void copy(int x, int y) { rt[x] = rt[y]; }
  int query(int t, int x) { return query(rt[t], 0, 1e9, x, x); }
  int query(int t, int x, int y) { return query(rt[t], 0, 1e9, x, y); }
  void add(int t, int x, int y) { add(rt[t], rt[t], 0, 1e9, x, y); }
} A, B;
char op[10];
string ss;
map<string, int> mp;
int id;
int main() {
  int T;
  scanf("%d", &T);
  for (int i = 1; i <= T; i++) {
    scanf("%s", op);
    A.copy(i, i - 1);
    B.copy(i, i - 1);
    if (op[0] == 's') {
      int x, old;
      cin >> ss;
      scanf("%d", &x);
      if (!mp[ss])
        mp[ss] = ++id, old = 0;
      else
        old = B.query(i, mp[ss]);
      A.add(i, x, 1);
      B.add(i, mp[ss], x - old);
      if (old) A.add(i, old, -1);
    }
    if (op[0] == 'r') {
      cin >> ss;
      int old = B.query(i, mp[ss]);
      if (old) B.add(i, mp[ss], -old), A.add(i, old, -1);
    }
    if (op[0] == 'q') {
      cin >> ss;
      int old = B.query(i, mp[ss]);
      if (old)
        printf("%d\n", A.query(i, 0, old - 1));
      else
        puts("-1");
    }
    if (op[0] == 'u') {
      int x;
      scanf("%d", &x);
      A.copy(i, i - x - 1);
      B.copy(i, i - x - 1);
    }
    fflush(stdout);
  }
  return 0;
}
