#include #include #include #include using namespace std; bool singleblocked[7000000]; int blocked[7000000]; int r, c; int nempty; int q[7000000]; int seen[7000000]; int dx[4]{-1,0,1,0}; int dy[4]{0,1,0,-1}; int indices[3000]; int casenum; vector colscan[3000]; bool can(int sz) { for(int i = 0; i < r; i++) { colscan[i].clear(); } memset(indices, 0, sizeof(indices)); int ql = 0; int qr = 0; for(int i = 0; qr == 0 && i + sz <= r; i++) { for(int j = 0; qr == 0 && j + sz <= c; j++) { if(blocked[(i+sz)*(c+1) + (j+sz)] - blocked[i*(c+1) + j + sz] - blocked[(i+sz)*(c+1) + j] + blocked[i*(c+1) + j] == 0) { q[qr++] = i*(c+1)+j; seen[i*(c+1)+j] = casenum; colscan[i].push_back(j); } } } if(qr == 0) return false; while(ql < qr) { int curr = q[ql++]; int rr = curr / (c+1); int cc = curr % (c+1); for(int k = 0; k < 4; k++) { int nr = rr + dx[k]; int nc = cc + dy[k]; if(nr < 0 || nr+sz > r || nc < 0 || nc+sz > c) continue; if(seen[nr*(c+1)+nc] == casenum) continue; if(blocked[(nr+sz)*(c+1) + (nc+sz)] - blocked[nr*(c+1) + nc + sz] - blocked[(nr+sz)*(c+1) + nc] + blocked[nr*(c+1) + nc] == 0) { q[qr++] = (nr*(c+1)+nc); colscan[nr].push_back(nc); seen[nr*(c+1)+nc] = casenum; } } } for(int a = 0; a < r; a++) sort(colscan[a].begin(), colscan[a].end()); for(int j = 1; j <= c; j++) { for(int i = 1; i <= r; i++) { if(singleblocked[i*(c+1)+j]) continue; bool can = false; for(int a = max(0, i - sz); !can && a < i; a++) { while(indices[a] < colscan[a].size() && colscan[a][indices[a]] < j - sz) indices[a]++; can = indices[a] < colscan[a].size() && colscan[a][indices[a]] < j; } if(!can) return false; } } return true; } void solve() { cin >> r >> c; bool swapped = false; if(r > c) { swap(r, c); swapped = true; } { int n; cin >> n; while(n--) { int x, y; cin >> x >> y; if(swapped) swap(x, y); blocked[x*(c+1)+y]++; singleblocked[x*(c+1)+y] = true; } for(int i = 1; i <= r; i++) { for(int j = 1; j <= c; j++) { blocked[i*(c+1)+j] += blocked[i*(c+1)+j-c-1]; blocked[i*(c+1)+j] += blocked[i*(c+1)+j-1]; blocked[i*(c+1)+j] -= blocked[i*(c+1)+j-c-2]; } } } int lhs = 0; int rhs = r; while(lhs < rhs) { casenum++; int mid = (lhs+rhs+1)/2; if(can(mid)) lhs = mid; else rhs = mid-1; } if(lhs == 0) lhs = -1; cout << lhs << "\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); solve(); }