#ifndef LOCAL #pragma GCC optimize("O3") #endif #include using namespace std; #define sim template muu & operator<<( #define ris return *this #define eni(r) sim> typename enable_if <1 r sizeof(dud(0)),muu&>::type operator<<(c g) { sim> struct rge {c b,e ;}; sim> rge range(c i, c j) {return rge{i, j};} sim> auto dud(c *r)-> decltype(cerr << *r); sim> char dud(...); struct muu { #ifdef LOCAL stringstream a; ~muu() {cerr << a.str() << endl;} eni(<) a << boolalpha << g; ris;} eni(==) ris << range(begin(g), end(g));} sim, class m mor pair r) {ris << "(" << r.first << ", " << r.second << ")";} sim mor rge u) { a << "["; for (c i = u.b; i != u.e; ++i) *this << ", " + 2 * (i == u.b) << *i; ris << "]"; } #else sim mor const c&) {ris;} #endif muu & operator()(){ris;} }; #define debug (muu() << __FUNCTION__ << "#" << __LINE__ << ": ") #define imie(r) "[" #r ": " << (r) << "] " #define imask(r) "[" #r ": " << bitset<8 * sizeof(r)>(r) << "] " #define arr(a, i) "[" #a imie(i) ": " << a[i] << "] " #define arr2(a, i, j) "[" #a imie(i) imie(j) ": " << a[i][j] << "] " const int nax = 1e5 + 10, K = 51; bool water[K][nax]; int u[nax * K]; int find (int x ) { if (u[x] == x) return x; return u[x] = find(u[x]); } void unio(int a, int b) { debug() << imie(a) imie(b); u[find(a)] = find(b); } bool is_water(int x, int y) { debug << imie(x) imie(y); return x >= 1 && x <= 50 && y >= 1 && y < nax && water[x][y]; } int ne[K][nax]; int get_ne(int x, int y) { if (ne[x][y] == y) return y; return ne[x][y] = get_ne(x, ne[x][y]); } int nr(int x, int y) { debug << imie(x) imie(y); return y * 50 + x; } int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1}; void rem(int x, int y) { debug() << imie(x) imie(y); water[x][y] = true; for (int d = 0; d < 4; ++d) if (is_water(x + dx[d], y + dy[d])) unio(nr(x, y), nr(x + dx[d], y + dy[d])); ne[x][y] = y + 1; } int main() { for (int i = 0 ; i < nax * K; ++i) u[i] = i; for (int i = 0; i < K; ++i) for (int j = 0; j < nax; ++j) ne[i][j] = j; int q; scanf("%d", &q); while (q--) { int t, x1, x2, y1, y2; scanf("%d%d%d%d%d", &t, &x1, &y1, &x2, &y2); if (t == 0) { for (int x = x1; x <= x2; ++x) { int p = get_ne(x, y1); while (p <= y2) { rem(x, p); p = get_ne(x, p); } } } else { if (find(nr(x1, y1)) == find(nr(x2, y2)) && is_water(x1, y1)) printf("1\n"); else printf("0\n"); } } }