#include <bits/stdc++.h>
using namespace std;
string itos(int x) {
  stringstream ss;
  ss << x;
  return ss.str();
}
struct node {
  int l, r, cnt;
  node() {
    l = r = -1;
    cnt = 0;
  }
} T[1500010];
int q, t, x, y, nt;
int rev(int x) {
  int ret = 0;
  for (int i = 0; i < 27; i++) {
    ret <<= 1;
    ret += x % 2;
    x >>= 1;
  }
  return ret;
}
void upd(int pos, int x, int dx, int d = 0) {
  if (d == 28) return;
  T[pos].cnt += dx;
  if (x % 2) {
    if (T[pos].r == -1) T[pos].r = ++nt;
    upd(T[pos].r, x >> 1, dx, d + 1);
  } else {
    if (T[pos].l == -1) T[pos].l = ++nt;
    upd(T[pos].l, x >> 1, dx, d + 1);
  }
  return;
}
int ask(int pos, int x, int y) {
  if (pos == -1) return 0;
  int tot = 0;
  if (x % 2) {
    if (y % 2) {
      if (T[pos].r != -1) tot += T[T[pos].r].cnt;
      tot += ask(T[pos].l, x >> 1, y >> 1);
    } else
      tot += ask(T[pos].r, x >> 1, y >> 1);
  } else {
    if (y % 2) {
      if (T[pos].l != -1) tot += T[T[pos].l].cnt;
      tot += ask(T[pos].r, x >> 1, y >> 1);
    } else
      tot += ask(T[pos].l, x >> 1, y >> 1);
  }
  return tot;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> q;
  while (q--) {
    cin >> t;
    if (t == 1) {
      cin >> x;
      upd(0, rev(x), 1);
    } else if (t == 2) {
      cin >> x;
      upd(0, rev(x), -1);
    } else if (t == 3) {
      cin >> x >> y;
      cout << ask(0, rev(x), rev(y)) << endl;
    }
  }
  return 0;
}
