#include <bits/stdc++.h>
using namespace std;
long long h[5000000];
long long l[5000000];
long long r[5000000];
long long xx[5000000];
long long kol[5000000];
long long o;
void push(long long v) {
  if ((h[v] & xx[v]) != 0) {
    swap(l[v], r[v]);
  }
  xx[l[v]] ^= xx[v];
  xx[r[v]] ^= xx[v];
  xx[v] = 0;
}
void add(long long v, long long x) {
  push(v);
  kol[v]++;
  long long H = h[v];
  if (H == 0) return;
  if ((x & H) == 0) {
    if (l[v] == 0) {
      l[v] = ++o;
      h[l[v]] = H / 2;
    }
    add(l[v], x);
  } else {
    if (r[v] == 0) {
      r[v] = ++o;
      h[r[v]] = H / 2;
    }
    add(r[v], x);
  }
  assert(h[l[v]] <= h[v]);
  assert(h[r[v]] <= h[v]);
}
void del(long long v, long long x) {
  assert(v != 0);
  push(v);
  kol[v]--;
  long long H = h[v];
  if (H == 0) return;
  if ((x & H) == 0) {
    del(l[v], x);
  } else {
    del(r[v], x);
  }
  assert(h[l[v]] <= h[v]);
  assert(h[r[v]] <= h[v]);
}
long long les(long long v, long long x) {
  push(v);
  long long H = h[v];
  if (kol[v] == 0) return 0;
  if (H == 0) return 0;
  if ((x & H) == 0) {
    return les(l[v], x);
  } else {
    return kol[l[v]] + les(r[v], x);
  }
  assert(h[l[v]] <= h[v]);
  assert(h[r[v]] <= h[v]);
}
int main() {
  long long q;
  o = 1;
  h[1] = (1 << 30);
  for (cin >> q; q > 0; q--) {
    long long t;
    cin >> t;
    if (t == 1) {
      long long x;
      cin >> x;
      add(1, x);
    }
    if (t == 2) {
      long long x;
      cin >> x;
      del(1, x);
    }
    if (t == 3) {
      long long x, y;
      cin >> x >> y;
      xx[1] ^= x;
      cout << les(1, y) << endl;
      xx[1] ^= x;
    }
    assert(kol[0] == 0);
  }
  return 0;
}
