#include #include #include #include #include #include #include #include #define FOR(i,a,b) for (int i = (a); i < (b); ++i) #define REP(i,n) FOR(i,0,n) #define TRACE(x) cerr << #x << " = " << x << endl #define _ << " _ " << #define pb push_back #define X first #define Y second using namespace std; typedef long long ll; typedef pair pii; typedef pair magija; int gr[200005]; int used; int un(int x){if (gr[x] == x) return x; return gr[x] = un(gr[x]);} void join(int a, int b){gr[un(a)] = un(b);} int get(){return used++;} bool ok(pii a, pii b){ if (a.Y < b.X-1) return false; if (b.Y < a.X-1) return false; return true; } magija join(magija a, magija b){ join(a.Y, b.Y); return {{min(a.X.X, b.X.X), max(a.X.Y, b.X.Y)}, a.Y}; } void merge(set &row, magija obj){ auto it = row.lower_bound(obj); while (it != row.end()){ if (!ok(obj.X, it->X)) break; obj = join(obj, *it); row.erase(it++); } it = row.lower_bound(obj); while (it != row.begin()){ --it; if (!ok(obj.X, it->X)) break; obj = join(obj, *it); row.erase(it++); } row.insert(obj); } int l; set rows[55]; int get(int x, int y){ auto &row = rows[x]; if (row.empty()) return -1; magija tmp = {{y, y}, -1}; auto it = row.lower_bound(tmp); if (it == row.end()) --it; if (it->X.X <= y && y <= it->X.Y) return it->Y; if (it == row.begin()) return -1; --it; if (it->X.X <= y && y <= it->X.Y) return it->Y; return -1; } void display(set &row){ for (auto m : row) cout << "(" << m.X.X << " " << m.X.Y << " " << m.Y << ")" << " "; cout << endl; } int main(){ ios_base::sync_with_stdio(false); REP(i,200005) gr[i] = i; cin >> l; REP(i,l){ int t; pii pt1; pii pt2; cin >> t; cin >> pt1.X >> pt1.Y; cin >> pt2.X >> pt2.Y; if (t == 0){ int id = get(); FOR(x,pt1.X,pt2.X+1) merge(rows[x], {{pt1.Y, pt2.Y}, id}); } else { int id1 = get(pt1.X, pt1.Y); int id2 = get(pt2.X, pt2.Y); // TRACE(id1 _ id2); if (id1 != -1 && id2 != -1 && un(id1) == un(id2)) cout << 1 << "\n"; else cout << 0 << "\n"; } } // REP(x,10) display(rows[x]); return 0; }