// Date: 24/08/2025
// Author: pppssslc
#include<bits/stdc++.h>
using namespace std;
template<class X, class Y> void mini(X &x, const Y &y){
x = min(x, y);
}
template<class X, class Y> void maxi(X &x, const Y &y){
x = max(x, y);
}
typedef string str;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 i128;
typedef double db;
typedef long double ldb;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<char> vc;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
typedef vector<vector<int>> vii;
typedef vector<vector<ll>> vll;
typedef vector<vector<char>> vcc;
typedef map<int, int> mpii;
typedef map<ll, ll> mpll;
typedef set<int> si;
typedef set<ll> sl;
typedef complex<double> cd;
#define se second
#define fi first
#define Rep(i, l, r, x) for(int i = l; i < (int)r; i += x)
#define Repd(i, l, r, x) for(int i = l; i > (int)r; i -= x)
#define For(i, l, r, x) for(int i = l; i <= (int)r; i += x)
#define Ford(i, l, r, x) for(int i = l; i >= (int)r; i -= x)
#define Fore(x, a) for(auto x: a)
#define pb push_back
#define pf push_front
#define pp pop_back
#define ppf pop_front
#define ins insert
#define era erase
#define upb upper_bound
#define lwb lower_bound
#define all(a) a.begin(), a.end()
struct qry{
int t, u, v;
};
struct dsu{
vi par;
vi sz;
stack<pair<pii, pii>> his;
dsu(int n){
par.resize(n + 1);
sz.resize(n + 1);
For(i, 1, n, 1)
par[i] = i, sz[i] = 1;
}
int find(int i){
while(par[i] != i) i = par[i];
return i;
}
void uni(int u, int v){
int ru = find(u), rv = find(v);
if(ru != rv){
if(sz[ru] < sz[rv]) swap(ru, rv);
his.push({{rv, par[rv]}, {ru, sz[ru]}});
par[rv] = ru, sz[ru] += sz[rv];
}else his.push({{-1, -1}, {-1, -1}});
}
void roll(){
auto last = his.top();
his.pop();
if(last.fi.fi == -1) return;
par[last.fi.fi] = last.fi.se;
sz[last.se.fi] = last.se.se;
}
};
const db PI = acos(-1);
const ll inf = 1e18 + 1;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 1;
int n, q;
vpii st[maxn * 4];
vi ans;
void upd(int id, int l, int r, int u, int v, pii e){
if(r < u || v < l) return;
if(u <= l && r <= v){
st[id].pb(e);
return;
}
int m = (l + r) / 2;
upd(id * 2, l, m, u, v, e);
upd(id * 2 + 1, m + 1, r, u, v, e);
}
void get(int id, int l, int r, dsu &dsu, const vector<qry> &qries){
Fore(e, st[id]) dsu.uni(e.fi, e.se);
//pppssslc's code, who copies this will be a dog.
if(l == r){ if(qries[l - 1].t == 3)
ans.pb(dsu.find(qries[l - 1].u) == dsu.find(qries[l - 1].v));
}else{
int m = l + (r - l) / 2;
get(2 * id, l, m, dsu, qries);
get(2 * id + 1, m + 1, r, dsu, qries);
}
Rep(i, 0, st[id].size(), 1) dsu.roll();
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cin >> n >> q;
vector<qry> qries(q);
map<pii, stack<int>> edges;
Rep(i, 0, q, 1){
cin >> qries[i].t >> qries[i].u >> qries[i].v;
if(qries[i].u > qries[i].v) swap(qries[i].u, qries[i].v);
if(qries[i].t == 1) edges[{qries[i].u, qries[i].v}].push(i + 1);
else if(qries[i].t == 2){
pii key = {qries[i].u, qries[i].v};
if(edges.count(key) && !edges[key].empty()){
int st = edges[key].top();
edges[key].pop();
upd(1, 1, q, st, i, key);
}
}
}
for(auto &[e, t]: edges){
while(!t.empty()){
int st = t.top(); t.pop();
upd(1, 1, q, st, q, e);
}
}
dsu dsu(n);
get(1, 1, q, dsu, qries);
Fore(x, ans) cout << x;
return 0;
}
Ly8gRGF0ZTogMjQvMDgvMjAyNQovLyBBdXRob3I6IHBwcHNzc2xjCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8Y2xhc3MgWCwgY2xhc3MgWT4gdm9pZCBtaW5pKFggJngsIGNvbnN0IFkgJnkpewoJeCA9IG1pbih4LCB5KTsKfQoKdGVtcGxhdGU8Y2xhc3MgWCwgY2xhc3MgWT4gdm9pZCBtYXhpKFggJngsIGNvbnN0IFkgJnkpewoJeCA9IG1heCh4LCB5KTsKfQoKdHlwZWRlZiBzdHJpbmcgc3RyOwp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWxsOwp0eXBlZGVmIF9faW50MTI4IGkxMjg7CnR5cGVkZWYgZG91YmxlIGRiOwp0eXBlZGVmIGxvbmcgZG91YmxlIGxkYjsKdHlwZWRlZiBwYWlyPGludCwgaW50PiBwaWk7CnR5cGVkZWYgcGFpcjxsbCwgbGw+IHBsbDsKdHlwZWRlZiB2ZWN0b3I8aW50PiB2aTsKdHlwZWRlZiB2ZWN0b3I8bGw+IHZsOwp0eXBlZGVmIHZlY3RvcjxjaGFyPiB2YzsKdHlwZWRlZiB2ZWN0b3I8cGlpPiB2cGlpOwp0eXBlZGVmIHZlY3RvcjxwbGw+IHZwbGw7CnR5cGVkZWYgdmVjdG9yPHZlY3RvcjxpbnQ+PiB2aWk7CnR5cGVkZWYgdmVjdG9yPHZlY3RvcjxsbD4+IHZsbDsKdHlwZWRlZiB2ZWN0b3I8dmVjdG9yPGNoYXI+PiB2Y2M7CnR5cGVkZWYgbWFwPGludCwgaW50PiBtcGlpOwp0eXBlZGVmIG1hcDxsbCwgbGw+IG1wbGw7CnR5cGVkZWYgc2V0PGludD4gc2k7CnR5cGVkZWYgc2V0PGxsPiBzbDsKdHlwZWRlZiBjb21wbGV4PGRvdWJsZT4gY2Q7CgojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgUmVwKGksIGwsIHIsIHgpIGZvcihpbnQgaSA9IGw7IGkgPCAoaW50KXI7IGkgKz0geCkKI2RlZmluZSBSZXBkKGksIGwsIHIsIHgpIGZvcihpbnQgaSA9IGw7IGkgPiAoaW50KXI7IGkgLT0geCkKI2RlZmluZSBGb3IoaSwgbCwgciwgeCkgZm9yKGludCBpID0gbDsgaSA8PSAoaW50KXI7IGkgKz0geCkKI2RlZmluZSBGb3JkKGksIGwsIHIsIHgpIGZvcihpbnQgaSA9IGw7IGkgPj0gKGludClyOyBpIC09IHgpCiNkZWZpbmUgRm9yZSh4LCBhKSBmb3IoYXV0byB4OiBhKQojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIHBmIHB1c2hfZnJvbnQKI2RlZmluZSBwcCBwb3BfYmFjawojZGVmaW5lIHBwZiBwb3BfZnJvbnQKI2RlZmluZSBpbnMgaW5zZXJ0CiNkZWZpbmUgZXJhIGVyYXNlCiNkZWZpbmUgdXBiIHVwcGVyX2JvdW5kCiNkZWZpbmUgbHdiIGxvd2VyX2JvdW5kCiNkZWZpbmUgYWxsKGEpIGEuYmVnaW4oKSwgYS5lbmQoKQoKc3RydWN0IHFyeXsKCWludCB0LCB1LCB2Owp9OwoKc3RydWN0IGRzdXsKCXZpIHBhcjsKCXZpIHN6OwoJc3RhY2s8cGFpcjxwaWksIHBpaT4+IGhpczsKCQoJZHN1KGludCBuKXsKCQlwYXIucmVzaXplKG4gKyAxKTsKCQlzei5yZXNpemUobiArIDEpOwoJCUZvcihpLCAxLCBuLCAxKQoJCQlwYXJbaV0gPSBpLCBzeltpXSA9IDE7Cgl9CgoJaW50IGZpbmQoaW50IGkpewoJCXdoaWxlKHBhcltpXSAhPSBpKSBpID0gcGFyW2ldOwoJCXJldHVybiBpOwoJfQoJCgl2b2lkIHVuaShpbnQgdSwgaW50IHYpewoJCWludCBydSA9IGZpbmQodSksIHJ2ID0gZmluZCh2KTsKCQlpZihydSAhPSBydil7CgkJCWlmKHN6W3J1XSA8IHN6W3J2XSkgc3dhcChydSwgcnYpOwoJCQloaXMucHVzaCh7e3J2LCBwYXJbcnZdfSwge3J1LCBzeltydV19fSk7CgkJCXBhcltydl0gPSBydSwgc3pbcnVdICs9IHN6W3J2XTsKCQl9ZWxzZSBoaXMucHVzaCh7ey0xLCAtMX0sIHstMSwgLTF9fSk7Cgl9CgoJdm9pZCByb2xsKCl7CgkJYXV0byBsYXN0ID0gaGlzLnRvcCgpOwoJCWhpcy5wb3AoKTsKCQlpZihsYXN0LmZpLmZpID09IC0xKSByZXR1cm47CgkJcGFyW2xhc3QuZmkuZmldID0gbGFzdC5maS5zZTsKCQlzeltsYXN0LnNlLmZpXSA9IGxhc3Quc2Uuc2U7Cgl9Cn07Cgpjb25zdCBkYiBQSSA9IGFjb3MoLTEpOwpjb25zdCBsbCBpbmYgPSAxZTE4ICsgMTsKY29uc3QgaW50IG1vZCA9IDFlOSArIDc7CmNvbnN0IGludCBtYXhuID0gMWU1ICsgMTsKCmludCBuLCBxOwp2cGlpIHN0W21heG4gKiA0XTsKdmkgYW5zOwoKdm9pZCB1cGQoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdiwgcGlpIGUpewoJaWYociA8IHUgfHwgdiA8IGwpIHJldHVybjsKCWlmKHUgPD0gbCAmJiByIDw9IHYpewoJCXN0W2lkXS5wYihlKTsKCQlyZXR1cm47Cgl9CglpbnQgbSA9IChsICsgcikgLyAyOwoJdXBkKGlkICogMiwgbCwgbSwgdSwgdiwgZSk7Cgl1cGQoaWQgKiAyICsgMSwgbSArIDEsIHIsIHUsIHYsIGUpOwp9Cgp2b2lkIGdldChpbnQgaWQsIGludCBsLCBpbnQgciwgZHN1ICZkc3UsIGNvbnN0IHZlY3Rvcjxxcnk+ICZxcmllcyl7CglGb3JlKGUsIHN0W2lkXSkgZHN1LnVuaShlLmZpLCBlLnNlKTsKCS8vcHBwc3NzbGMncyBjb2RlLCB3aG8gY29waWVzIHRoaXMgd2lsbCBiZSBhIGRvZy4KCWlmKGwgPT0gcil7IGlmKHFyaWVzW2wgLSAxXS50ID09IDMpCgkJYW5zLnBiKGRzdS5maW5kKHFyaWVzW2wgLSAxXS51KSA9PSBkc3UuZmluZChxcmllc1tsIC0gMV0udikpOwoJfWVsc2V7CgkJaW50IG0gPSBsICsgKHIgLSBsKSAvIDI7CgkJZ2V0KDIgKiBpZCwgbCwgbSwgZHN1LCBxcmllcyk7CgkJZ2V0KDIgKiBpZCArIDEsIG0gKyAxLCByLCBkc3UsIHFyaWVzKTsKCX0KCVJlcChpLCAwLCBzdFtpZF0uc2l6ZSgpLCAxKSBkc3Uucm9sbCgpOwp9CgpzaWduZWQgbWFpbigpewoJaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CgljaW4udGllKG51bGxwdHIpOyBjb3V0LnRpZShudWxscHRyKTsKCQoJY2luID4+IG4gPj4gcTsKCXZlY3Rvcjxxcnk+IHFyaWVzKHEpOwoJbWFwPHBpaSwgc3RhY2s8aW50Pj4gZWRnZXM7CgkKCVJlcChpLCAwLCBxLCAxKXsKCQljaW4gPj4gcXJpZXNbaV0udCA+PiBxcmllc1tpXS51ID4+IHFyaWVzW2ldLnY7CgkJaWYocXJpZXNbaV0udSA+IHFyaWVzW2ldLnYpIHN3YXAocXJpZXNbaV0udSwgcXJpZXNbaV0udik7CgkJaWYocXJpZXNbaV0udCA9PSAxKSBlZGdlc1t7cXJpZXNbaV0udSwgcXJpZXNbaV0udn1dLnB1c2goaSArIDEpOwoJCWVsc2UgaWYocXJpZXNbaV0udCA9PSAyKXsKCQkJcGlpIGtleSA9IHtxcmllc1tpXS51LCBxcmllc1tpXS52fTsKCQkJaWYoZWRnZXMuY291bnQoa2V5KSAmJiAhZWRnZXNba2V5XS5lbXB0eSgpKXsKCQkJCWludCBzdCA9IGVkZ2VzW2tleV0udG9wKCk7CgkJCQllZGdlc1trZXldLnBvcCgpOwoJCQkJdXBkKDEsIDEsIHEsIHN0LCBpLCBrZXkpOwoJCQl9CgkJfQoJfQoKCWZvcihhdXRvICZbZSwgdF06IGVkZ2VzKXsKCQl3aGlsZSghdC5lbXB0eSgpKXsKCQkJaW50IHN0ID0gdC50b3AoKTsgdC5wb3AoKTsKCQkJdXBkKDEsIDEsIHEsIHN0LCBxLCBlKTsKCQl9Cgl9CgoJZHN1IGRzdShuKTsKCWdldCgxLCAxLCBxLCBkc3UsIHFyaWVzKTsKCUZvcmUoeCwgYW5zKSBjb3V0IDw8IHg7CglyZXR1cm4gMDsKfQ==