#include <bits/stdc++.h>
#define int long long
#define double long double
#define endl '\n'
#define fi first
#define se second
#define vi vector<int>
#define pii pair<int, int>
#define TIME 1.0 * clock() / CLOCKS_PER_SEC
#define all(v) v.begin(), v.end()
using namespace std;
typedef long long ll;
bool M1;
template < typename T> void maximize( T & a, T b) { if ( a < b) a = b; }
template < typename T> void minimize( T & a, T b) { if ( a > b) a = b; }
const int MAXN = 4e5 + 7 ;
int n, t;
int enemy[ MAXN] ;
struct DSU{
int n;
vector < int > par;
DSU( int _n) : n( _n) { par.assign ( n + 7 , - 1 ) ; }
int find( int u) { return par[ u] < 0 ? u : u = find( par[ u] ) ; }
bool join( int x, int y) {
x = find( x) ;
y = find( y) ;
if ( x == y) return 0 ;
if ( par[ x] > par[ y] ) swap( x, y) ;
par[ x] + = par[ y] ;
par[ y] = x;
return 1 ;
}
} ;
signed main( ) {
ios_base:: sync_with_stdio ( 0 ) ;
cout .tie ( 0 ) ;
cin .tie ( 0 ) ;
// freopen("t.inp", "r", stdin);
// freopen("t.out", "w", stdout);
cin >> n >> t;
DSU dsu( 2 * n + 5 ) ;
auto otherSide = [ & ] ( int & x) { return n + x; } ;
while ( t-- ) {
int type, x, y;
cin >> type >> x >> y;
if ( type == 0 ) {
dsu.join ( x, y) ;
dsu.join ( otherSide( x) , otherSide( y) ) ;
}
else if ( type == 1 ) {
dsu.join ( x, otherSide( y) ) ;
dsu.join ( y, otherSide( x) ) ;
}
else {
if ( dsu.find ( x) == dsu.find ( otherSide( y) ) ) cout << 1 << endl;
else if ( dsu.find ( x) == dsu.find ( y) ) cout << 0 << endl;
else cout << - 1 << endl;
}
}
}
/*
Link:
oj.vnoi.info/problem/bedao_r22_e
Sol:
ibb.co/DHXS9BNj
- Cách làm:
Ta nén mấy đỉnh có cùng cực (đẩy nhau) thành 1 đỉnh bằng DSU
Và nối mấy cái đỉnh hút nhau (trái cực) thành 1 cái cây và được hình minh hoạ kia.
Quan sát cây, nhận xét được rằng:
Để tính được mối quan hệ giữa 2 đỉnh thì trước hết nó phải cùng thuộc 1 cái cây trước đã, và khoảng cách giữa chúng là lẻ thì mới hút nhau, ngược lại thì đẩy.
Vậy làm sao để xử lí được bài toán con này? Ta hãy xem cách làm ở phần bên phải kia.
- Idea cho subproblem:
Gọi e(x) = otherSide(x) = n + x, là cực khác của (x)
Theo hình trên quan sát được thì:
(2) = e(1) (1) = e(2)
(3) = e(2) (2) = e(3)
(4) = e(3) (3) = e(4)
(5) = e(4) (4) = e(3)
Nếu hút nhau/khác cực (khoảng cách là lẻ) thì find(u) = find(e(v)) hoặc ngược lại. (cái này nháp là ra...)
Nếu đẩy nhau/cùng cực (khoảng cách là chẵng) thì
find(u) = find(v), cũng như find(u) != find(e(v))
Có nghĩa nếu khác cực thì
TH còn lại: -1
==> Ta sử dụng tính chất 1 đỉnh có 2 cực là để gán cùng cực và trái cực để tạo thành 1 cái cây nối các đỉnh hút nhau và có tính ziczac để tạo tính chẵn lẻ
*/
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGRvdWJsZSBsb25nIGRvdWJsZQojZGVmaW5lIGVuZGwgJ1xuJwojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgdmkgdmVjdG9yPGludD4KI2RlZmluZSBwaWkgcGFpcjxpbnQsIGludD4KI2RlZmluZSBUSU1FIDEuMCAqIGNsb2NrKCkgLyBDTE9DS1NfUEVSX1NFQwojZGVmaW5lIGFsbCh2KSB2LmJlZ2luKCksIHYuZW5kKCkKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CmJvb2wgTTE7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBtYXhpbWl6ZShUICZhLCBUIGIpe2lmKGEgPCBiKSBhID0gYjt9CnRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIG1pbmltaXplKFQgJmEsIFQgYil7aWYoYSA+IGIpIGEgPSBiO30KCmNvbnN0IGludCBNQVhOID0gNGU1ICsgNzsKCmludCBuLCB0OwppbnQgZW5lbXlbTUFYTl07CgoKc3RydWN0IERTVXsKICAgIGludCBuOwogICAgdmVjdG9yIDxpbnQ+IHBhcjsKCiAgICBEU1UoaW50IF9uKSA6IG4oX24pIHtwYXIuYXNzaWduKG4gKyA3LCAtMSk7fQoKICAgIGludCBmaW5kKGludCB1KXtyZXR1cm4gcGFyW3VdIDwgMCA/IHUgOiB1ID0gZmluZChwYXJbdV0pO30KCiAgICBib29sIGpvaW4oaW50IHgsIGludCB5KXsKICAgICAgICB4ID0gZmluZCh4KTsKICAgICAgICB5ID0gZmluZCh5KTsKCiAgICAgICAgaWYoeCA9PSB5KSByZXR1cm4gMDsKCiAgICAgICAgaWYocGFyW3hdID4gcGFyW3ldKSBzd2FwKHgsIHkpOwoKICAgICAgICBwYXJbeF0gKz0gcGFyW3ldOwogICAgICAgIHBhclt5XSA9IHg7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKfTsKCgoKc2lnbmVkIG1haW4oKXsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjb3V0LnRpZSgwKTsKICAgIGNpbi50aWUoMCk7CgovLyAgICBmcmVvcGVuKCJ0LmlucCIsICJyIiwgc3RkaW4pOwovLyAgICBmcmVvcGVuKCJ0Lm91dCIsICJ3Iiwgc3Rkb3V0KTsKCgogICAgY2luID4+IG4gPj4gdDsKCiAgICBEU1UgZHN1KDIgKiBuICsgNSk7CgogICAgYXV0byBvdGhlclNpZGUgPSBbJl0oaW50ICZ4KXtyZXR1cm4gbiArIHg7fTsKCiAgICB3aGlsZSh0LS0pewogICAgICAgIGludCB0eXBlLCB4LCB5OwoKICAgICAgICBjaW4gPj4gdHlwZSA+PiB4ID4+IHk7CgoKICAgICAgICBpZih0eXBlID09IDApewogICAgICAgICAgICBkc3Uuam9pbih4LCB5KTsKICAgICAgICAgICAgZHN1LmpvaW4ob3RoZXJTaWRlKHgpLCBvdGhlclNpZGUoeSkpOwogICAgICAgIH0KCiAgICAgICAgZWxzZSBpZih0eXBlID09IDEpewogICAgICAgICAgICBkc3Uuam9pbih4LCBvdGhlclNpZGUoeSkpOwogICAgICAgICAgICBkc3Uuam9pbih5LCBvdGhlclNpZGUoeCkpOwogICAgICAgIH0KCiAgICAgICAgZWxzZXsKCiAgICAgICAgICAgIGlmKGRzdS5maW5kKHgpID09IGRzdS5maW5kKG90aGVyU2lkZSh5KSkpIGNvdXQgPDwgMSA8PCBlbmRsOwogICAgICAgICAgICBlbHNlIGlmKGRzdS5maW5kKHgpID09IGRzdS5maW5kKHkpKSBjb3V0IDw8IDAgPDwgZW5kbDsKICAgICAgICAgICAgZWxzZSBjb3V0IDw8IC0xIDw8IGVuZGw7CgogICAgICAgIH0KCiAgICB9CgoKCgoKCn0KLyoKTGluazogCm9qLnZub2kuaW5mby9wcm9ibGVtL2JlZGFvX3IyMl9lCgpTb2w6CmliYi5jby9ESFhTOUJOagoKCi0gQ8OhY2ggbMOgbToKClRhIG7DqW4gbeG6pXkgxJHhu4luaCBjw7MgY8O5bmcgY+G7sWMgKMSR4bqpeSBuaGF1KSB0aMOgbmggMSDEkeG7iW5oIGLhurFuZyBEU1UKClbDoCBu4buRaSBt4bqleSBjw6FpIMSR4buJbmggaMO6dCBuaGF1ICh0csOhaSBj4buxYykgdGjDoG5oIDEgY8OhaSBjw6J5IHbDoCDEkcaw4bujYyBow6xuaCBtaW5oIGhv4bqhIGtpYS4KClF1YW4gc8OhdCBjw6J5LCBuaOG6rW4geMOpdCDEkcaw4bujYyBy4bqxbmc6CgrEkOG7gyB0w61uaCDEkcaw4bujYyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIDIgxJHhu4luaCB0aMOsIHRyxrDhu5tjIGjhur90IG7DsyBwaOG6o2kgY8O5bmcgdGh14buZYyAxIGPDoWkgY8OieSB0csaw4bubYyDEkcOjLCB2w6Aga2hv4bqjbmcgY8OhY2ggZ2nhu69hIGNow7puZyBsw6AgbOG6uyB0aMOsIG3hu5tpIGjDunQgbmhhdSwgbmfGsOG7o2MgbOG6oWkgdGjDrCDEkeG6qXkuCgpW4bqteSBsw6BtIHNhbyDEkeG7gyB44butIGzDrSDEkcaw4bujYyBiw6BpIHRvw6FuIGNvbiBuw6B5PyBUYSBow6N5IHhlbSBjw6FjaCBsw6BtIOG7nyBwaOG6p24gYsOqbiBwaOG6o2kga2lhLgoKCi0gSWRlYSBjaG8gc3VicHJvYmxlbToKCkfhu41pIGUoeCkgPSBvdGhlclNpZGUoeCkgPSBuICsgeCwgbMOgIGPhu7FjIGtow6FjIGPhu6dhICh4KQoKClRoZW8gaMOsbmggdHLDqm4gcXVhbiBzw6F0IMSRxrDhu6NjIHRow6w6CgoKCigyKSA9IGUoMSkgICAgICAgICAgICAgICgxKSA9IGUoMikKCgoKKDMpID0gZSgyKSAgICAgICAgICAgICAgKDIpID0gZSgzKQoKCgooNCkgPSBlKDMpICAgICAgICAgICAgICAoMykgPSBlKDQpCgoKCig1KSA9IGUoNCkgICAgICAgICAgICAgICg0KSA9IGUoMykKCk7hur91IGjDunQgbmhhdS9raMOhYyBj4buxYyAoa2hv4bqjbmcgY8OhY2ggbMOgIGzhurspIHRow6wgZmluZCh1KSA9IGZpbmQoZSh2KSkgaG/hurdjIG5nxrDhu6NjIGzhuqFpLiAoY8OhaSBuw6B5IG5ow6FwIGzDoCByYS4uLikKCk7hur91IMSR4bqpeSBuaGF1L2PDuW5nIGPhu7FjIChraG/huqNuZyBjw6FjaCBsw6AgY2jhurVuZykgdGjDrApmaW5kKHUpID0gZmluZCh2KSwgY8WpbmcgbmjGsCBmaW5kKHUpICE9IGZpbmQoZSh2KSkKCkPDsyBuZ2jEqWEgbuG6v3Uga2jDoWMgY+G7sWMgdGjDrAoKVEggY8OybiBs4bqhaTogLTEKCj09PiBUYSBz4butIGThu6VuZyB0w61uaCBjaOG6pXQgMSDEkeG7iW5oIGPDsyAyIGPhu7FjIGzDoCDEkeG7gyBnw6FuIGPDuW5nIGPhu7FjIHbDoCB0csOhaSBj4buxYyDEkeG7gyB04bqhbyB0aMOgbmggMSBjw6FpIGPDonkgbuG7kWkgY8OhYyDEkeG7iW5oIGjDunQgbmhhdSB2w6AgY8OzIHTDrW5oIHppY3phYyDEkeG7gyB04bqhbyB0w61uaCBjaOG6tW4gbOG6uwoKCiovCg==