#include #pragma GCC optimize("O3") using namespace std; int aint[2][1402][5602]; int rmq[2][1402][14][1402]; int logs[1402]; vector > rot(2000, vector (2000)); void build(int LC, int poz, int nod, int L, int R) { for(int i = 1; i <= 1400; i++) { if(LC == 0) rmq[LC][poz][0][i] = rot[poz][i]; else rmq[LC][poz][0][i] = rot[i][poz]; //if(LC == 1 && poz == 703 && i >= 0 && i <= 15) //cout << rot[i][poz] << " "; } //if(LC == 1 && poz == 703) // cout << '\n'; for(int i = 1; i <= logs[1400]; i++) { for(int j = 1; j + (1<> n >> m >> k; vector > v(n+1, vector (m+1)); for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) cin >> v[i][j]; for(int i = 1; i <= n*m; i++) ans[i] = -1; for(int i = 2; i <= 1400; i++) logs[i] = logs[i/2] + 1; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) rot[i+j][i-j+700] = v[i][j]; for(int i = 1; i <= n+m; i++) build(0, i, 1, 1, 1400); for(int i = 1; i < 1400; i++) build(1, i, 1, 1, 1400); for(int i = 0; i <= 1400; i++) minimaxi[i] = 1000000; for(int i = 1; i <= k; i++) { int L, C; cin >> L >> C; int line = L+C; int column = L-C+700; int mxx = 0; for(int dist = 0; dist <= n+m; dist++) { bool ok = 0; // going up int first_line = max(1, line-dist); int last_line = min(1400, line+dist); int first_column = max(1, column-dist); int last_column = min(1400, column+dist); //if(i == 3) // cout << i << " " << line << " " << column << " " << first_line << " " << last_line << " " << first_column << " " << last_column << '\n'; if(first_line) ok = 1, mxx = max(mxx, query(0, first_line, 1, 1, 1400, first_column, last_column)); if(last_line <= 1400) ok = 1, mxx = max(mxx, query(0, last_line, 1, 1, 1400, first_column, last_column)); if(first_column) ok = 1, mxx = max(mxx, query(1, first_column, 1, 1, 1400, first_line, last_line)); //if(i == 3) // cout << query(1, last_column, 1, 1, 1400, first_line, last_line) << '\n'; if(last_column < 1400) ok = 1, mxx = max(mxx, query(1, last_column, 1, 1, 1400, first_line, last_line)); minimaxi[dist] = min(minimaxi[dist], mxx); //if(i == 3 && mxx == 48) // cout << "CN " << line << " " << column << " " << dist << '\n'; if(ok == 0) break; } } int lst = 0; for(int i = 0; i <= 1400; i++) { if(minimaxi[i] <= n*m) for(int j = lst+1; j <= min(n*m, minimaxi[i]); j++) ans[j] = i; lst = minimaxi[i]; } for(int i = 1; i <= n*m; i++) cout << ans[i] << " "; return 0; }