#include <bits/stdc++.h>
#define ll int
#define el "\n"
#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define __ROOT__ int main()
#define fi first
#define se second
#define M 1000000007
#define MAXN 1000001
using namespace std;
ll n, q;
ll arr[MAXN], sz[MAXN], par[MAXN], next_pos[MAXN];
ll find_set(ll a) {
if (a == par[a]) return a;
return par[a] = find_set(par[a]);
}
void union_set(ll a, ll b) {
a = find_set(a);
b = find_set(b);
if (a == b) return;
if (sz[a] < sz[b]) swap(a, b);
par[b] = a;
sz[a] += sz[b];
}
void init() {
cin >> n >> q;
for (ll i = 1; i <= n; i++) {
par[i] = i;
sz[i] = 1;
next_pos[i] = i + 1;
}
}
void merge_range(ll x, ll y ){
while(x<= y){
union_set(x,x+1) ;
ll t = x;
x = next_pos[x] ; // bỏ qua các vị trí đã hợp
next_pos[t] = y +1 ;
}
}
void solve() {
while (q--) {
ll t, x, y;
cin >> t >> x >> y;
if (t == 1) {
union_set(x, y);
} else if (t == 2) {
merge_range(x, y);
} else {
x = find_set(x);
y = find_set(y);
if (x == y) {
cout << "YES" << el;
} else {
cout << "NO" << el;
}
}
}
}
__ROOT__ {
fast;
init();
solve();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgaW50CiNkZWZpbmUgZWwgIlxuIgojZGVmaW5lIGZhc3QgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiNkZWZpbmUgX19ST09UX18gaW50IG1haW4oKQojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgTSAxMDAwMDAwMDA3CiNkZWZpbmUgTUFYTiAxMDAwMDAxCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpsbCBuLCBxOwpsbCBhcnJbTUFYTl0sIHN6W01BWE5dLCBwYXJbTUFYTl0sIG5leHRfcG9zW01BWE5dOwoKbGwgZmluZF9zZXQobGwgYSkgewogICAgaWYgKGEgPT0gcGFyW2FdKSByZXR1cm4gYTsKICAgIHJldHVybiBwYXJbYV0gPSBmaW5kX3NldChwYXJbYV0pOwp9Cgp2b2lkIHVuaW9uX3NldChsbCBhLCBsbCBiKSB7CiAgICBhID0gZmluZF9zZXQoYSk7CiAgICBiID0gZmluZF9zZXQoYik7CiAgICBpZiAoYSA9PSBiKSByZXR1cm47CiAgICBpZiAoc3pbYV0gPCBzeltiXSkgc3dhcChhLCBiKTsKICAgIHBhcltiXSA9IGE7CiAgICBzelthXSArPSBzeltiXTsKfQoKdm9pZCBpbml0KCkgewogICAgY2luID4+IG4gPj4gcTsKICAgIGZvciAobGwgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgcGFyW2ldID0gaTsKICAgICAgICBzeltpXSA9IDE7CiAgICAgICAgbmV4dF9wb3NbaV0gPSBpICsgMTsKICAgIH0KfQoKdm9pZCBtZXJnZV9yYW5nZShsbCB4LCBsbCB5ICl7CndoaWxlKHg8PSB5KXsKICAgIHVuaW9uX3NldCh4LHgrMSkgOwogICAgbGwgdCA9IHg7CiAgICB4ID0gbmV4dF9wb3NbeF0gOyAvLyBi4buPIHF1YSBjw6FjIHbhu4sgdHLDrSDEkcOjIGjhu6NwCiAgICBuZXh0X3Bvc1t0XSA9IHkgKzEgOwp9Cn0KCnZvaWQgc29sdmUoKSB7CiAgICB3aGlsZSAocS0tKSB7CiAgICAgICAgbGwgdCwgeCwgeTsKICAgICAgICBjaW4gPj4gdCA+PiB4ID4+IHk7CiAgICAgICAgaWYgKHQgPT0gMSkgewogICAgICAgICAgICB1bmlvbl9zZXQoeCwgeSk7CiAgICAgICAgfSBlbHNlIGlmICh0ID09IDIpIHsKICAgICAgICAgICAgbWVyZ2VfcmFuZ2UoeCwgeSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgeCA9IGZpbmRfc2V0KHgpOwogICAgICAgICAgICB5ID0gZmluZF9zZXQoeSk7CiAgICAgICAgICAgIGlmICh4ID09IHkpIHsKICAgICAgICAgICAgICAgIGNvdXQgPDwgIllFUyIgPDwgZWw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb3V0IDw8ICJOTyIgPDwgZWw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCl9fUk9PVF9fIHsKICAgIGZhc3Q7CiAgICBpbml0KCk7CiAgICBzb2x2ZSgpOwp9Cg==