#include using namespace std; typedef pair < int, int > PII; const int N = 1e5 + 7; const int K = 55; #define MP make_pair PII par[K][N]; int par2[K][N]; bool vis[K][N]; PII Find(int x, int y) { if(par[x][y] == MP(x, y)) return MP(x, y); return par[x][y] = Find(par[x][y].first, par[x][y].second); } int Find2(int x, int y) { if(par2[x][y] == y) return y; return par2[x][y] = Find2(x, par2[x][y]); } void Union(int x1, int y1, int x2, int y2) { PII a = Find(x1, y1), b = Find(x2, y2); if(a == b) return; par[a.first][a.second] = b; } void Union2(int x, int y1, int y2) { int a = Find2(x, y1), b = Find2(x, y2); if(a == b) return; if(a > b) swap(a, b); par2[x][a] = b; } void update(int x, int y1, int y2) { int y = y1; while(y <= y2) { // cerr << x << " " << y << " " << vis[x][y] << "\n"; if(vis[x][y]) { int z = Find2(x, y); y = z + 1; } else { vis[x][y] = true; int p[] = {1, 0, 0, 1, -1, 0, 0, -1}; for(int i = 0; i < 8; i += 2) { int ux = x + p[i], uy = y + p[i + 1]; if(vis[ux][uy]) { Union(x, y, ux, uy); } } if(vis[x][y - 1]) Union2(x, y, y - 1); if(vis[x][y + 1]) Union2(x, y, y + 1); y++; } } } int main() { for(int i = 1; i < K; i++) for(int j = 1; j < N; j++) { par[i][j] = {i, j}; par2[i][j] = j; } int q; scanf("%d", &q); while(q--) { int t, x1, y1, x2, y2; scanf("%d %d %d %d %d", &t, &x1, &y1, &x2, &y2); if(t == 0) { if(x1 > x2) swap(x1, x2); if(y1 > y2) swap(y1, y2); for(int x = x1; x <= x2; x++) { update(x, y1, y2); } } else { PII a = Find(x1, y1), b = Find(x2, y2); printf("%d\n", (a == b ? 1 : 0)); } } return 0; }