#ifdef ONLINE_JUDGE #include #else #include #include #include #include #include #include #include #include #include #include #include #include #include #endif using namespace std; // lambda : [] (int a, int b) -> bool { body return } // string r_str = R"(raw string)" #define mp make_pair #define eb emplace_back #define pb push_back #define LL long long #define ULL unsigned long long #define BASE 73 #define NMAX 10000 #define NMAX2 20001 #define MOD1 1000000007 #define ALL(V) (V).begin(), (V).end() #define ALLR(V) (V).rbegin(), (V).rend() #define CRLINE Duxar(__LINE__); #define SHOWME(x) cerr << __LINE__ << ": " << #x << " = " << (x) << endl; #define ENTER putchar('\n'); int dx4[] = {-1, 0, 1, 0}; int dy4[] = {0, 1, 0, -1}; int dx6[] = {-1, -1, 0, 1, 1, 1, 0, -1}; int dy6[] = {0, 1, 1, 1, 0, -1, -1, -1}; void Duxar(int _this_line) { #ifndef ONLINE_JUDGE printf("\n . . . . . . . . . . . . . Passed line - %d\n", _this_line); #endif } template void ReadNo(T &_value) { T _sign = 1; char ch; _value = 0; while(!isdigit(ch = getchar())) { (ch == '-') && (_sign = -1); } do { _value = _value * 10 + (ch - '0'); } while(isdigit(ch = getchar())); _value *= _sign; } template void AddNr(T &a, T b) { a = a + b; while (a >= MOD1) { a -= MOD1; } while (a < 0) { a += MOD1; } } const int buffer=1<<13; char buff[buffer]; int cnt=0; int getInt() { int number = 0; while(buff[cnt] < '0' || '9' < buff[cnt]) if(++cnt >= buffer) fread(buff, buffer, 1, stdin), cnt = 0; while('0' <= buff[cnt] && buff[cnt] <= '9') { number = number * 10 + buff[cnt] - '0'; if(++cnt >= buffer) fread(buff, buffer, 1, stdin), cnt = 0; } return number; } int N, M; vector weight, root; stack > s_root, s_weight; int GetRoot(int x) { while (x != root[x]) { x = root[x]; } return x; } void Merge(int x, int y) { if (weight[x] < weight[y]) { swap(x, y); } root[y] = x; weight[x] += weight[y]; } int main(){ #ifndef ONLINE_JUDGE // freopen("", "r", stdin); #endif int i, t, x, y, rx, ry; // ReadNo(N); ReadNo(M); N = getInt(); M = getInt(); weight.resize(N + 1, 1); root.resize(N + 1); for (i = 1; i <= N; ++i) { root[i] = i; } for (i = 0; i < M; ++i) { // ReadNo(t); t = getInt(); if (t == 1) { // ReadNo(x); ReadNo(y); x = getInt(); y = getInt(); rx = GetRoot(x); ry = GetRoot(y); s_root.push({rx, ry}); s_weight.push({weight[rx], weight[ry]}); Merge(rx, ry); } if (t == 3) { // ReadNo(x); ReadNo(y); x = getInt(); y = getInt(); rx = GetRoot(x); ry = GetRoot(y); printf("%d\n", (int) (rx == ry)); } if (t == 2) { int z; // ReadNo(z); z = getInt(); while (z--) { x = s_root.top().first; y = s_root.top().second; s_root.pop(); root[x] = x; root[y] = y; weight[x] = s_weight.top().first; weight[y] = s_weight.top().second; s_weight.pop(); } } } return 0; }