#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) return false; if (b.Y < a.X) 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); auto it = row.lower_bound( { {obj.X.X, -10000000}, -1 }); while (it != row.end()){ if (!ok(obj.X, it->X)) break; obj = join(obj, *it); row.erase(it++); } // it = row.lower_bound(obj); it = row.lower_bound({ {obj.X.X, 10000000}, 10000000} ); 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[105]; int get(int x, int y){ auto &row = rows[x]; if (row.empty()) return -1; magija tmp = {{y, -1}, -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) { if (pt1.X > pt2.X) swap(pt1.X, pt2.X); if (pt1.Y > pt2.Y) swap(pt1.Y, pt2.Y); } pt1.X *= 2; pt1.Y *= 2; pt2.X *= 2; pt2.Y *= 2; if (t == 0){ int id = get(); magija obj = {{pt1.Y-1, pt2.Y+1}, id}; FOR(x,pt1.X,pt2.X+1) merge(rows[x], obj); obj.X.X++; obj.X.Y--; merge(rows[pt1.X-1], obj); merge(rows[pt2.X+1], obj); } else { int id1 = get(pt1.X, pt1.Y); int id2 = get(pt2.X, pt2.Y); if (id1 != -1 && id2 != -1 && un(id1) == un(id2)) cout << 1 << "\n"; else cout << 0 << "\n"; } } // REP(x,10) display(rows[x]); return 0; }