#include #include #include using namespace std; int K, N; vector > A, SA, ans; int soucet(int r, int s, int d) { int r1 = max(0, r+s-d), c1 = max(0, r-s+N-1-d), r2 = min(2*N-1, r+s+d+1), c2 = min(2*N-1, r-s+N-1+d+1); return SA[r2][c2] - SA[r2][c1] - SA[r1][c2] + SA[r1][c1]; } int main() { // Načteme vstup a přitom rovnou transformujeme souřadnice cin >> K >> N; A.resize( 2*N-1, vector (2*N-1,0) ); for (int r=0; r> A[r+s][r-s+N-1]; // Spočítáme 2D prefixové součty SA.resize( 2*N, vector(2*N,0) ); for (int r=0; r<2*N-1; ++r) for (int s=0; s<2*N-1; ++s) SA[r+1][s+1] = SA[r+1][s] + SA[r][s+1] - SA[r][s] + A[r][s]; // Pro každou křižovatku určíme odpověď v logaritmickém čase // binárním vyhledáváním ans.resize( N, vector(N,0) ); for (int r=0; r= K) continue; // Pro toto políčko je odpověď 0 int lo=0, hi=2*N; // Invariant: lo < správná odpověď < hi while (hi - lo > 1) { if (soucet(r,s,(lo+hi)/2) >= K) hi=(lo+hi)/2; else lo=(lo+hi)/2; } ans[r][s] = hi; } for (int r=0; r