2023 rcpc

This commit is contained in:
2024-04-22 16:45:09 +03:00
parent a0ddb657b7
commit 156202ada0
61 changed files with 4462 additions and 0 deletions

View File

@@ -0,0 +1,123 @@
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
int aint[2][1402][5602];
int rmq[2][1402][14][1402];
int logs[1402];
vector<vector<int> > rot(2000, vector<int> (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<<i) - 1 <= 1400; j++)
{
rmq[LC][poz][i][j] = max(rmq[LC][poz][i-1][j], rmq[LC][poz][i-1][j+(1<<(i-1))]);
//if(LC == 1 && poz == 703 && j <= 15)
// cout << rmq[LC][poz][i][j] << " ";
}
//if(LC == 1 && poz == 703)
// cout << '\n';
}
}
int query(int LC, int poz, int nod, int st, int dr, int L, int R)
{
int lg = logs[R-L+1];
return max(rmq[LC][poz][lg][L], rmq[LC][poz][lg][R-(1<<lg)+1]);
}
int minimaxi[1402], ans[500002];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m, k;
cin >> n >> m >> k;
vector<vector<int> > v(n+1, vector<int> (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;
}