#include <bits/stdc++.h>
using namespace std;
struct ImplicitPersistentSegmentTree {
  int left[7010000], right[7010000];
  long long tree[7010000];
  int root[7010000], free_index = 1, cur_update = 0;
  long long update(long long s, long long e, long long id, long long i,
                   long long val) {
    long long cur_id = ++free_index;
    assert(free_index < 7010000);
    if (s == e) {
      tree[cur_id] = tree[id] + val;
      return cur_id;
    }
    long long mid = (s + e) / 2;
    left[cur_id] = left[id], right[cur_id] = right[id];
    if (i <= mid)
      left[cur_id] = update(s, mid, left[id], i, val);
    else
      right[cur_id] = update(mid + 1, e, right[id], i, val);
    tree[cur_id] = tree[left[cur_id]] + tree[right[cur_id]];
    return cur_id;
  }
  long long query(long long s, long long e, long long id, long long i) {
    if (s == e && e == i) return tree[id];
    long long mid = (s + e) / 2;
    if (i <= mid)
      return query(s, mid, left[id], i);
    else
      return tree[left[id]] + query(mid + 1, e, right[id], i);
  }
  void update(long long i, long long add) {
    root[cur_update + 1] = update(1, 1000000005, root[cur_update], i, add);
    cur_update++;
  }
  long long valueOf(long long i) {
    if (i == 1) return query(1, 1000000005, root[cur_update], i);
    return query(1, 1000000005, root[cur_update], i) -
           query(1, 1000000005, root[cur_update], i - 1);
  }
  long long valueLessThan(long long i) {
    if (i > 1) return query(1, 1000000005, root[cur_update], i - 1);
    return 0;
  }
  bool isPresent(long long i) {
    if (valueOf(i) == 0) return false;
    return true;
  }
};
ImplicitPersistentSegmentTree a, b;
long long ua[100005];
long long ub[100005];
long long Hash(string str) {
  unsigned long long value = 0;
  for (auto c : str) value = ((value << 5) + value) ^ c;
  return value % 100000007;
}
string op[100005], strings[100005];
int values[100005];
int counter = 0, fr = 0;
map<string, int> mapp;
int pushMap(string str) {
  if (mapp[str] == 0) {
    mapp[str] = ++fr;
  }
  return mapp[str];
}
int main() {
  long long n;
  cin >> n;
  long long cur = 0;
  for (long long i = 0; i < n; i++) {
    string fuck = op[i];
    cin >> fuck;
    if (fuck == "query") {
      string str = strings[i];
      cin >> str;
      long long h = pushMap(str);
      long long p = b.valueOf(h);
      if (p == 0) {
        cout << "-1\n";
      } else {
        long long res = a.valueLessThan(p);
        cout << res << "\n";
      }
    } else if (fuck == "set") {
      string str = strings[i];
      cin >> str;
      long long value = values[i];
      cin >> value;
      long long h = pushMap(str);
      long long p = b.valueOf(h);
      if (p) {
        a.update(p, -1);
      }
      b.update(h, -p + value);
      a.update(value, 1);
    } else if (fuck == "remove") {
      string str = strings[i];
      cin >> str;
      long long h = pushMap(str);
      long long p = b.valueOf(h);
      if (p) {
        b.update(h, -p);
        a.update(p, -1);
      }
    } else {
      long long v = values[i];
      cin >> v;
      a.root[++a.cur_update] = ua[i - v - 1];
      b.root[++b.cur_update] = ub[i - v - 1];
    }
    ua[i] = a.root[a.cur_update];
    ub[i] = b.root[b.cur_update];
  }
  return 0;
}
