Pagini recente » Cod sursa (job #3366897) | Cod sursa (job #3366883) | Cod sursa (job #3366880) | Cod sursa (job #3366895) | Cod sursa (job #3366878)
#include <bits/stdc++.h>
#define in fin
#define out fout
using namespace std;
const int NMAX = 1005;
ifstream fin("struti.in");
ofstream fout("struti.out");
int v[NMAX][NMAX];
int v1[NMAX][NMAX]; // pt maxim
int v2[NMAX][NMAX]; // pt minim
int n, m;
void transforma_minim_pls(int k){
for(int j = 0; j < m; j++){
deque<int> q;
for(int i = 0; i < n; i++){
while(!q.empty() && q.back() > v[i][j]) q.pop_back();
q.push_back(v[i][j]);
if(i >= k){
if(!q.empty() && q.front() == v[i - k][j]) q.pop_front();
}
if(i >= k - 1) v1[i - k + 1][j] = q.front();
}
}
}
void transforma_maxim_pls(int k){
for(int j = 0; j < m; j++){
deque<int> q;
for(int i = 0; i < n; i++){
while(!q.empty() && q.back() < v[i][j]) q.pop_back();
q.push_back(v[i][j]);
if(i >= k){
if(!q.empty() && q.front() == v[i - k][j]) q.pop_front();
}
if(i >= k - 1) v2[i - k + 1][j] = q.front();
}
}
}
pair<int, int> give_pls(int dx, int dy){
int diff = INT_MAX, cnt = 0;
for(int i = 0; i + dx - 1 < n; i++){
deque<int> q1, q2;
for(int j = 0; j < m; j++){
while(!q1.empty() && q1.back() > v1[i][j]) q1.pop_back();
q1.push_back(v1[i][j]);
while(!q2.empty() && q2.back() < v2[i][j]) q2.pop_back();
q2.push_back(v2[i][j]);
if(j >= dy){
if(!q1.empty() && q1.front() == v1[i][j - dy]) q1.pop_front();
if(!q2.empty() && q2.front() == v2[i][j - dy]) q2.pop_front();
}
if(j >= dy - 1){
int mini = -1, maxi = -1;
if(!q1.empty()) mini = q1.front();
if(!q2.empty()) maxi = q2.front();
if(maxi - mini < diff){
diff = maxi - mini;
cnt = 1;
}else if(maxi - mini == diff) cnt++;
}
}
}
return {diff, cnt};
//out << diff << " " << cnt << '\n';
}
void reset_mat(){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
v1[i][j] = v2[i][j] = 0;
}
}
}
int main()
{
in >> n >> m;
int p; in >> p;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++) in >> v[i][j];
}
for(int ii = 0; ii < p; ii++){
int dx, dy; in >> dx >> dy;
reset_mat();
transforma_minim_pls(dx);
transforma_maxim_pls(dx);
pair<int, int> var1 = give_pls(dx, dy);
swap(dx, dy);
reset_mat();
transforma_minim_pls(dx);
transforma_maxim_pls(dx);
pair<int, int> var2 = give_pls(dx, dy);
if(dx == dy){
var2 = {-1, 0};
}
if(var1.first == var2.first) out << var1.first << " " << var1.second + var2.second << '\n';
else if(var1.first > var2.first) out << var1.first << " " << var1.second << '\n';
else out << var2.first << " " << var2.second << '\n';
}
return 0;
}