#include <bits/stdc++.h>
using namespace std;
int m, i, id, o, x;
char op[9];
string s;
map<string, int> mp;
struct Tree {
  int id, rt[111111], L[111111 * 60], R[111111 * 60], S[111111 * 60];
  void add(int& x, int y, int l, int r, int z, int v) {
    x = ++id;
    L[x] = L[y];
    R[x] = R[y];
    S[x] = S[y] + v;
    if (l == r) return;
    int md = l + r >> 1;
    if (z <= md)
      add(L[x], L[y], l, md, z, v);
    else
      add(R[x], R[y], md + 1, r, z, v);
  }
  int qu(int k, int l, int r, int x, int y) {
    if (!k) return 0;
    if (x <= l && r <= y) return S[k];
    int md = l + r >> 1, v = 0;
    if (x <= md) v += qu(L[k], l, md, x, y);
    if (y > md) v += qu(R[k], md + 1, r, x, y);
    return v;
  }
  void cg(int x, int y, int z) { add(rt[x], rt[x], 0, 1e9, y, z); }
  int qu(int x, int z) { return qu(rt[x], 0, 1e9, z, z); }
  int qu(int x, int l, int r) { return qu(rt[x], 0, 1e9, l, r); }
  void cp(int x, int y) { rt[x] = rt[y]; }
} A, B;
int main() {
  for (scanf("%d", &m), i = 1; i <= m; i++) {
    scanf("%s", op);
    A.cp(i, i - 1);
    B.cp(i, i - 1);
    if (op[0] == 's') {
      cin >> s;
      scanf("%d", &x);
      if (!mp[s])
        mp[s] = ++id, o = 0;
      else
        o = B.qu(i, mp[s]);
      A.cg(i, x, 1);
      B.cg(i, mp[s], x - o);
      if (o) A.cg(i, o, -1);
    }
    if (op[0] == 'r') {
      cin >> s;
      if (o = B.qu(i, mp[s])) B.cg(i, mp[s], -o), A.cg(i, o, -1);
    }
    if (op[0] == 'q') {
      cin >> s;
      if (o = B.qu(i, mp[s]))
        printf("%d\n", A.qu(i, 0, o - 1));
      else
        puts("-1");
    }
    if (op[0] == 'u') scanf("%d", &x), A.cp(i, i - x - 1), B.cp(i, i - x - 1);
    fflush(stdout);
  }
}
