#include <bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
  cerr << name << " : " << arg1 << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}
const int mxv = 7009;
bitset<mxv> mu, a[100009], mask[71];
int p[7009];
vector<int> g[7009];
void pre() {
  mu.reset();
  mu[1] = 1;
  int cnt = 0;
  for (int i = 2; i <= (7000); ++i) {
    if (!p[i]) {
      for (int j = 2 * i; j <= 7000; j += i) p[j] = i;
      mu[i] = 1;
      cnt++;
    } else {
      if (mu[i / p[i]] == 0 || (i / p[i]) % p[i] == 0)
        mu[i] = 0;
      else
        mu[i] = 1, cnt++;
    }
  }
  for (int i = 1; i <= (7000); ++i) {
    for (int j = i; j <= 7000; j += i) g[j].push_back(i);
  }
  for (int i = 1; i <= (70); ++i) {
    for (int j = i; j <= 7000; j += i) mask[i][j] = mu[j / i];
  }
}
void solve() {}
int main() {
  cin.sync_with_stdio(0);
  cin.tie(0);
  cin.exceptions(cin.failbit);
  pre();
  int n;
  cin >> n;
  int q;
  cin >> q;
  for (int i = 0; i < (q); ++i) {
    int t, x, v;
    cin >> t >> x >> v;
    if (t == 1) {
      a[x].reset();
      for (auto& j : g[v]) a[x][j] = 1;
    } else if (t == 2) {
      int z;
      cin >> z;
      a[x] = a[v] ^ a[z];
    } else if (t == 3) {
      int z;
      cin >> z;
      a[x] = a[v] & a[z];
    } else {
      if (v > 70) {
        bool ans = 0;
        for (int j = 1; j <= (7000); ++j) {
          if (j * v > 7000) break;
          ans ^= mu[j] & a[x][j * v];
        }
        cout << ans;
      } else {
        cout << (mask[v] & a[x]).count() % 2;
      }
    }
  }
  return 0;
}
