#include #include #include using namespace std; #define ITER 16 #define MAX (2LL< *grid = 0; long long encode(long long x, long long y) { return x*MAX + y; } void decode(long long c, long long &x, long long &y) { x = c/MAX; y = c%MAX; } bool get(long long x, long long y) { if (x<0 || y<0) { return true; } else if (x>=MAX || y>=MAX) { // the end exit(0); } else { return grid->test(encode(x,y)); } } void set(long long x, long long y) { grid->set(encode(x,y)); } vector genbl; // bottom left vector gentr; // top right vector newgenbl; vector newgentr; void check(long long x, long long y) { if (!get(x,y)) { long long minx=x, maxx=x, miny=y, maxy=y; while (!get(minx-1, y)) { minx--; } while (!get(maxx+1, y)) { maxx++; } while (!get(x, miny-1)) { miny--; } while (!get(x, maxy+1)) { maxy++; } for (long long xx=minx; xx<=maxx; xx++) { for (long long yy=miny; yy<=maxy; yy++) { set(xx, yy); } } newgenbl.push_back(encode(minx, miny)); newgentr.push_back(encode(maxx, maxy)); } } void explore(long long bl, long long tr) { long long minx, maxx, miny, maxy; decode(bl, minx, miny); decode(tr, maxx, maxy); for (long long x=minx; x<=maxx; x++) { check(x, miny-2); check(x, maxy+2); } for (long long y=miny; y<=maxy; y++) { check(minx-2, y); check(maxx+2, y); } } int main() { grid = new bitset; for (long long b=0; b