#include using namespace std; typedef long long ll; typedef pair pii; const int height = 50, width = 100000; vector sef(width * height, -1), subtree(width * height, 1); int daj_sefa(int a) { if (sef[a] == -1) { return a; } return sef[a] = daj_sefa(sef[a]); } void join(int a, int b) { a = daj_sefa(a); b = daj_sefa(b); if (a == b) return; if (subtree[a] < subtree[b]) swap(a, b); sef[b] = a; if (subtree[a] == subtree[b]) subtree[a] ++; } vector > water(height, vector(width, false)); const int dX[4] = {0, 1, 0, -1}, dY[4] = {-1, 0, 1, 0}; void flood(int x, int y) { water[y][x] = true; for (int smer=0; smer<4; smer++) { int nx = x+dX[smer], ny = y + dY[smer]; if (nx >= 0 && nx < width && ny >= 0 && ny < height && water[ny][nx]) { join(y * width + x, ny * width + nx); } } } struct Segtree { vector tree; vector start, end; int offset; Segtree(int n) { for (offset=1; offset < n; offset *= 2); tree.resize(offset * 2, 0); start.resize(offset*2); end.resize(offset*2); start[1] = 0; end[1] = offset; for (int i=1; i= end[node]) return; if (tree[node] & mask == mask) return; if (end[node] == start[node]+1) { ll change = mask & (~tree[node]); for (int y=0; y y2) swap(y1, y2); x1--; x2--; if (x1 > x2) swap(x1, x2); if (t == 0) { ll mask = 0; for (int y = y1; y <= y2; y++) { mask |= (1ll << y); } strom.update(1, mask, x1, x2+1); } else { int s1 = daj_sefa(y1 * width + x1); int s2 = daj_sefa(y2 * width + x2); if (s1 == s2) { printf("1\n"); } else { printf("0\n"); } } } }