#include <bits/stdc++.h>
using namespace std;
namespace trie {
class node {
 public:
  int val, ch[26];
} t[1600010];
int nodecnt = 0, rt[100010];
void modify(int &p, int q, char *s, int len, int pos, int v) {
  p = ++nodecnt;
  t[p] = t[q];
  if (pos == len) {
    t[p].val = v;
    return;
  }
  modify(t[p].ch[s[pos] - 'a'], t[q].ch[s[pos] - 'a'], s, len, pos + 1, v);
}
int query(int p, char *s, int len, int pos) {
  if (!p) return -1;
  if (len == pos) return t[p].val;
  return query(t[p].ch[s[pos] - 'a'], s, len, pos + 1);
}
};  // namespace trie
namespace sgt {
class node {
 public:
  int ch[2], sum;
} t[6400010];
int nodecnt = 0, rt[100010];
void modify(int &p, int q, int l, int r, int pos, int v) {
  p = ++nodecnt;
  t[p] = t[q];
  if (l == r) {
    t[p].sum += v;
    return;
  }
  int mid = (l + r) >> 1;
  if (pos <= mid)
    modify(t[p].ch[0], t[q].ch[0], l, mid, pos, v);
  else
    modify(t[p].ch[1], t[q].ch[1], mid + 1, r, pos, v);
  t[p].sum = t[t[p].ch[0]].sum + t[t[p].ch[1]].sum;
}
int query(int p, int l, int r, int ql, int qr) {
  if (!p) return 0;
  if (ql <= l && r <= qr) return t[p].sum;
  int mid = (l + r) >> 1, out = 0;
  if (ql <= mid) out = query(t[p].ch[0], l, mid, ql, qr);
  if (qr > mid) out += query(t[p].ch[1], mid + 1, r, ql, qr);
  return out;
}
}  // namespace sgt
int q, x;
char opt[10], name[20];
int main() {
  scanf("%d", &q);
  trie::t[0].val = -1;
  for (int i = 1; i <= q; i++) {
    scanf("%s", opt);
    sgt::rt[i] = sgt::rt[i - 1];
    trie::rt[i] = trie::rt[i - 1];
    if (opt[0] == 's') {
      scanf("%s%d", name, &x);
      int l = strlen(name);
      int t = trie::query(trie::rt[i], name, l, 0);
      if (t != -1) sgt::modify(sgt::rt[i], sgt::rt[i], 0, 1000000000, t, -1);
      trie::modify(trie::rt[i], trie::rt[i], name, l, 0, x);
      sgt::modify(sgt::rt[i], sgt::rt[i], 0, 1000000000, x, 1);
    } else if (opt[0] == 'r') {
      scanf("%s", name);
      int l = strlen(name);
      int t = trie::query(trie::rt[i], name, l, 0);
      if (t == -1) continue;
      sgt::modify(sgt::rt[i], sgt::rt[i], 0, 1000000000, t, -1);
      trie::modify(trie::rt[i], trie::rt[i], name, l, 0, -1);
    } else if (opt[0] == 'q') {
      scanf("%s", name);
      int l = strlen(name);
      int t = trie::query(trie::rt[i], name, l, 0);
      if (t == -1)
        puts("-1");
      else
        printf("%d\n", sgt::query(sgt::rt[i], 0, 1000000000, 0, t - 1));
      fflush(stdout);
    } else {
      scanf("%d", &x);
      trie::rt[i] = trie::rt[i - x - 1];
      sgt::rt[i] = sgt::rt[i - x - 1];
    }
  }
  return 0;
}
