Pagini recente » Cod sursa (job #3244301) | Monitorul de evaluare | Atasamentele paginii Profil rhovinion | Monitorul de evaluare | Cod sursa (job #3333008)
#include <bits/stdc++.h>
#define MAXN 1000
#define MAXALT 8000
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int mat[MAXN + 1][MAXN + 1], min_lin[MAXN + 1][MAXN + 1], min_col[MAXN + 1][MAXN + 1], max_lin[MAXN + 1][MAXN + 1], max_col[MAXN + 1][MAXN + 1];
int main()
{
int n, m, p, i, j, dim_lin, dim_col, MIN, NR, aux;
deque <int> dq_min, dq_max;
fin >> n >> m >> p;
for(i = 1; i <= n; i++){
for(j = 1; j <= m; j++){
fin >> mat[i][j];
}
}
while(p--){
fin >> dim_lin >> dim_col;
MIN = MAXALT + 1;
NR = 0;
for(i = 1; i <= n; i++){
while(!dq_min.empty()){
dq_min.pop_back();
}
while(!dq_max.empty()){
dq_max.pop_back();
}
for(j = 1; j <= m; j++){
if(!dq_min.empty() && dq_min.front() == j - dim_col){
dq_min.pop_front();
}
while(!dq_min.empty() && mat[i][dq_min.back()] >= mat[i][j]){
dq_min.pop_back();
}
dq_min.push_back(j);
if(j >= dim_col){
min_lin[i][j] = mat[i][dq_min.front()];
}
if(!dq_max.empty() && dq_max.front() == j - dim_col){
dq_max.pop_front();
}
while(!dq_max.empty() && mat[i][dq_max.back()] <= mat[i][j]){
dq_max.pop_back();
}
dq_max.push_back(j);
if(j >= dim_col){
max_lin[i][j] = mat[i][dq_max.front()];
}
}
}
// for(i = 1; i <= n; i++){
// for(j = 1; j <= m; j++){
// printf("%d ", max_lin[i][j]);
// }
// printf("\n");
// }
// printf("\n");
for(j = 1; j <= m; j++){
while(!dq_min.empty()){
dq_min.pop_back();
}
while(!dq_max.empty()){
dq_max.pop_back();
}
for(i = 1; i <= n; i++){
if(!dq_min.empty() && dq_min.front() == i - dim_lin){
dq_min.pop_front();
}
while(!dq_min.empty() && min_lin[dq_min.back()][j] >= min_lin[i][j]){
dq_min.pop_back();
}
dq_min.push_back(i);
if(i >= dim_lin){
min_col[i][j] = min_lin[dq_min.front()][j];
}
if(!dq_max.empty() && dq_max.front() == i - dim_lin){
dq_max.pop_front();
}
while(!dq_max.empty() && max_lin[dq_max.back()][j] <= max_lin[i][j]){
dq_max.pop_back();
}
dq_max.push_back(i);
if(i >= dim_lin){
max_col[i][j] = max_lin[dq_max.front()][j];
}
}
}
for(i = dim_lin; i <= n; i++){
for(j = dim_col; j <= m; j++){
if(max_col[i][j] - min_col[i][j] < MIN){
MIN = max_col[i][j] - min_col[i][j];
NR = 1;
}else if(max_col[i][j] - min_col[i][j] == MIN){
NR ++;
}
}
}
// printf("***\n");
// for(i = 1; i <= n; i++){
// for(j = 1; j <= m; j++){
// printf("%d ", max_col[i][j]);
// }
// printf("\n");
// }
// printf("\n");
/// //////////////////////////////////////////////////////////
if(dim_lin != dim_col){
aux = dim_lin;
dim_lin = dim_col;
dim_col = aux;
for(i = 1; i <= n; i++){
while(!dq_min.empty()){
dq_min.pop_back();
}
while(!dq_max.empty()){
dq_max.pop_back();
}
for(j = 1; j <= m; j++){
if(!dq_min.empty() && dq_min.front() == j - dim_col){
dq_min.pop_front();
}
while(!dq_min.empty() && mat[i][dq_min.back()] >= mat[i][j]){
dq_min.pop_back();
}
dq_min.push_back(j);
if(j >= dim_col){
min_lin[i][j] = mat[i][dq_min.front()];
}
if(!dq_max.empty() && dq_max.front() == j - dim_col){
dq_max.pop_front();
}
while(!dq_max.empty() && mat[i][dq_max.back()] <= mat[i][j]){
dq_max.pop_back();
}
dq_max.push_back(j);
if(j >= dim_col){
max_lin[i][j] = mat[i][dq_max.front()];
}
}
}
// for(i = 1; i <= n; i++){
// for(j = 1; j <= m; j++){
// printf("%d ", max_lin[i][j]);
// }
// printf("\n");
// }
// printf("\n");
for(j = 1; j <= m; j++){
while(!dq_min.empty()){
dq_min.pop_back();
}
while(!dq_max.empty()){
dq_max.pop_back();
}
for(i = 1; i <= n; i++){
if(!dq_min.empty() && dq_min.front() == i - dim_lin){
dq_min.pop_front();
}
while(!dq_min.empty() && min_lin[dq_min.back()][j] >= min_lin[i][j]){
dq_min.pop_back();
}
dq_min.push_back(i);
if(i >= dim_lin){
min_col[i][j] = min_lin[dq_min.front()][j];
}
if(!dq_max.empty() && dq_max.front() == i - dim_lin){
dq_max.pop_front();
}
while(!dq_max.empty() && max_lin[dq_max.back()][j] <= max_lin[i][j]){
dq_max.pop_back();
}
dq_max.push_back(i);
if(i >= dim_lin){
max_col[i][j] = max_lin[dq_max.front()][j];
}
}
}
for(i = dim_lin; i <= n; i++){
for(j = dim_col; j <= m; j++){
if(max_col[i][j] - min_col[i][j] < MIN){
MIN = max_col[i][j] - min_col[i][j];
NR = 1;
}else if(max_col[i][j] - min_col[i][j] == MIN){
NR ++;
}
}
}
}
fout << MIN << " " << NR << "\n";
}
return 0;
}