#include <bits/stdc++.h>
using namespace std;
struct node {
  int sub;
  int kind;
  node *parent;
  node *child[2];
} root;
inline node *Define(node *p, int k) {
  node *ptr = new node;
  (*ptr).sub = 0;
  (*ptr).kind = k;
  (*ptr).parent = p;
  (*ptr).child[0] = NULL;
  (*ptr).child[1] = NULL;
  return ptr;
}
void add(int p) {
  node *foo = &root;
  for (int i = 30; i >= 0; i--) {
    int res = (((1 << i) & p) > 0);
    if ((*foo).child[res] == NULL) (*foo).child[res] = Define(foo, res);
    (*foo).sub++;
    foo = (*foo).child[res];
  }
  (*foo).sub++;
}
void erase(int p) {
  node *foo = &root;
  for (int i = 30; i >= 0; i--) {
    int res = (((1 << i) & p) > 0);
    (*foo).sub--;
    foo = (*foo).child[res];
  }
  (*foo).sub--;
}
int query(int p, int u) {
  int ans = 0;
  node *foo = &root;
  for (int i = 30; i >= 0; i--) {
    int resp = (((1 << i) & p) > 0);
    int resu = (((1 << i) & u) > 0);
    if (resp == 0 && resu == 0) {
      if ((*foo).child[0] != NULL) {
        foo = (*foo).child[0];
      } else
        return ans;
    } else if (resp == 0 && resu == 1) {
      if ((*foo).child[0] != NULL) {
        ans += (*((*foo).child[0])).sub;
      }
      if ((*foo).child[1] != NULL) {
        foo = (*foo).child[1];
      } else
        return ans;
    } else if (resp == 1 && resu == 0) {
      if ((*foo).child[1] != NULL) {
        foo = (*foo).child[1];
      } else
        return ans;
    } else {
      if ((*foo).child[1] != NULL) {
        ans += (*((*foo).child[1])).sub;
      }
      if ((*foo).child[0] != NULL) {
        foo = (*foo).child[0];
      } else
        return ans;
    }
  }
  return ans;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  root.sub = 0;
  root.parent = NULL;
  root.child[0] = NULL;
  root.child[1] = NULL;
  int qq, tp, p;
  cin >> qq;
  while (qq--) {
    cin >> tp >> p;
    if (tp == 1)
      add(p);
    else if (tp == 2)
      erase(p);
    else {
      cin >> tp;
      cout << query(p, tp) << '\n';
    }
  }
  return 0;
}
