#include #include #include #include using namespace std; typedef long long llint; typedef pair pii; int n; const int MAXX = 51; const int MAXY = 1 << 17; int dad[MAXY*MAXX]; set S[MAXX]; int find(int x) { if (dad[x] == -1) return x; return dad[x] = find(dad[x]); } void connect(int a, int b) { a = find(a); b = find(b); if (a == b) return; dad[a] = b; } int position(int x, int y) { return x*MAXY + y; } int dx[] = {0,0,1,-1}; int dy[] = {1,-1,0,0}; bool bio[MAXX][MAXY]; void connect_around(int x, int y) { for (int d = 0; d < 4; ++d) { int nx = x + dx[d]; int ny = y + dy[d]; if (nx < 0 || ny < 0 || nx >= MAXX || ny >= MAXY) continue; if (!bio[nx][ny]) continue; connect(position(x, y), position(nx, ny)); } } void update(int x1, int y1, int x2, int y2) { for (int x = x1; x <= x2; ++x) { while (1) { auto it = S[x].lower_bound(y1); if (it == S[x].end()) break; if (*it > y2) break; bio[x][*it] = 1; connect_around(x, *it); S[x].erase(it); } } } int main(void) { memset(dad, -1, sizeof dad); scanf("%d", &n); for (int i = 0; i < MAXX; ++i) for (int j = 0; j < MAXY; ++j) S[i].insert(j); for (int i = 0; i < n; ++i) { int t, x1, y1, x2, y2; scanf("%d", &t); scanf("%d%d%d%d", &x1, &y1, &x2, &y2); --x1; --y1; --x2; --y2; if (t == 0) { update(x1, y1, x2, y2); } else { printf("%d\n", find(position(x1, y1)) == find(position(x2, y2))); } } return 0; }