#include #include #include #define MAX 16LL #define WIDTH (1LL< %lld %lld\n", x0, WIDTH); } Diagonal &prv = state[(x0+1)%2]; // previous diagonal Diagonal &cur = state[ x0 %2]; // current diagonal for (long long x=x0, y=0; x>=0; x--, y++) { long long v = 2*val2[x] + 3; long long h = 2*val2[y] + 2; long long nx = 2*MAX-2-2*val2[x]; long long ny = 2*MAX-1-2*val2[y]; if (x==0) { // left border cur.diag[x].hori = h; cur.diag[x].vert = 1; cut[ny]++; } else if (y==0) { // bottom border cur.diag[x].hori = 1; cur.diag[x].vert = v; cut[nx]++; } else { long long ph = prv.diag[x-1].hori; long long pv = prv.diag[x ].vert; if (ph==0) { if (pv==0) { cur.diag[x].hori = 0; cur.diag[x].vert = 0; } else { if (hph) { cur.diag[x].hori = 0; cur.diag[x].vert = pv; } else { cur.diag[x].hori = ph; cur.diag[x].vert = 0; } } } } } } // shrink for (long long x0=1; x0=x0; x++, y--) { long long v = 2*val2[x] + 3; long long h = 2*val2[y] + 2; long long nx = 2*MAX-2-2*val2[x]; long long ny = 2*MAX-1-2*val2[y]; long long ph = prv.diag[x-1].hori; long long pv = prv.diag[x ].vert; if (ph==0) { if (pv==0) { cur.diag[x].hori = 0; cur.diag[x].vert = 0; } else { if (hph) { cur.diag[x].hori = 0; cur.diag[x].vert = pv; } else { cur.diag[x].hori = ph; cur.diag[x].vert = 0; } } } } } // output size_t a = 1; printf("%lld %lld\n", 0, a); for (size_t n=0; n<2*MAX; n++) { printf("%lld %lld\n", n+1, a+=cut[n]); } return 0; }