#include #define ALL(x) (x).begin(), (x).end() #define SZ(x) (int) (x).size() #define pb push_back #define fi first #define se second using namespace std; typedef long long LL; typedef vector VI; typedef pair PII; typedef long double LD; const int X = 50, Y = (int)1e5, MX = X + 5, MY = Y + 5, MN = X * Y + 5, P2 = (1 << 17), MTS = 2 * P2 + 5; PII T[MX][MTS]; int rep[MN], ile[MN], woda[MX][MY]; int DX[] = {0, 0, -1, 1}; int DY[] = {-1, 1, 0, 0}; void blokuj(int x, int p) { p += P2; T[x][p] = {1, p - P2}; while(p > 1) { p >>= 1; T[x][p] = min(T[x][2 * p], T[x][2 * p + 1]); } } PII ask(int x, int a, int b) { PII ret = {1, 1}; a += P2, b += P2; while(a < b) { if(a & 1) ret = min(ret, T[x][a++]); if(!(b & 1)) ret = min(ret, T[x][b--]); a >>= 1, b >>= 1; } if(a == b) ret = min(ret, T[x][a]); return ret; } bool inside(int a, int b) { return ((min(a, b) >= 0) && (a <= X) && (b <= Y)); } int Find(int a) { if(a == rep[a]) return a; return (rep[a] = Find(rep[a])); } int Find(int a, int b) { a = (a - 1) * Y + b; return Find(a); } void Union(int a, int b) { a = Find(a); b = Find(b); if(a == b) return; if(ile[a] > ile[b]) { ile[a] += ile[b]; rep[b] = a; } else { ile[b] += ile[a]; rep[a] = b; } } void Union(int a, int b, int c, int d) { a = (a - 1) * Y + b; b = (c - 1) * Y + d; Union(a, b); } void dodaj(int x, int y) { blokuj(x, y); woda[x][y] = 1; for(int i = 0; i < 4; ++i) { int cx = x + DX[i], cy = y + DY[i]; if(inside(cx, cy) && woda[cx][cy]) Union(x, y, cx, cy); } } bool czy(int x1, int y1, int x2, int y2) { if(!woda[x1][y1]) return false; return (Find(x1, y1) == Find(x2, y2)); } void wstaw(int x1, int y1, int x2, int y2) { if(x1 > x2) swap(x1, x2); if(y1 > y2) swap(y1, y2); for(int x = x1; x <= x2; ++x) { while(1) { auto pyt = ask(x, y1, y2); if(pyt.fi == 1) break; dodaj(x, pyt.se); } } } int main() { for(int x = 1; x <= X; ++x) { for(int y = 1; y <= Y; ++y) { int cp = (x - 1) * Y + y; rep[cp] = cp; ile[cp] = 1; } for(int i = MTS - 1; i > 1; --i) { if(i >= P2) T[x][i] = {0, i - P2}; else T[x][i] = min(T[x][2 * i], T[x][2 * i + 1]); } } int l; scanf("%d", &l); while(l--) { int t, x1, y1, x2, y2; scanf("%d%d%d%d%d", &t, &x1, &y1, &x2, &y2); if(t == 0) wstaw(x1, y1, x2, y2); else printf("%d\n", (czy(x1, y1, x2, y2) == true ? 1 : 0)); } return 0; }