Pagini recente » Cod sursa (job #1930751) | Cod sursa (job #830040) | Cod sursa (job #2315464) | Cod sursa (job #787589) | Cod sursa (job #2756089)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
const int nmax = 1005;
int n, m, p, mat[nmax][nmax], maxx[nmax][nmax], minn[nmax][nmax], minim, cnt;
deque <int> d, d2;
void Solve(int x, int y){
for (int j = 1; j <= m; ++j){
d.clear();
d2.clear();
for (int i = 1; i <= x; ++i){
while (d.size() > 0 && mat[i][j] > mat[d.back()][j]) d.pop_back();
while (d2.size() > 0 && mat[i][j] < mat[d2.back()][j]) d2.pop_back();
d.push_back(i);
d2.push_back(i);
}
maxx[1][j] = mat[d.front()][j];
minn[1][j] = mat[d2.front()][j];
for (int i = x + 1; i <= n; ++i){
if (d.front() == i - x) d.pop_front();
if (d2.front() == i - x) d2.pop_front();
while (d.size() > 0 && mat[i][j] > mat[d.back()][j]) d.pop_back();
while (d2.size() > 0 && mat[i][j] < mat[d2.back()][j]) d2.pop_back();
d.push_back(i);
d2.push_back(i);
maxx[i - x + 1][j] = mat[d.front()][j];
minn[i - x + 1][j] = mat[d2.front()][j];
}
}
for (int i = 1; i <= n - x + 1; ++i){
d.clear();
d2.clear();
for (int j = 1; j <= y; ++j){
while (d.size() > 0 && maxx[i][j] > maxx[i][d.back()]) d.pop_back();
while (d2.size() > 0 && minn[i][j] < minn[i][d2.back()]) d2.pop_back();
d.push_back(j);
d2.push_back(j);
}
int diff = maxx[i][d.front()] - minn[i][d2.front()];
if (diff < minim){
minim = diff;
cnt = 1;
}
else if (diff == minim){
++cnt;
}
for (int j = y + 1; j <= m; ++j){
if (d.front() == j - y) d.pop_front();
if (d2.front() == j - y) d2.pop_front();
while (d.size() > 0 && maxx[i][j] > maxx[i][d.back()]) d.pop_back();
while (d2.size() > 0 && minn[i][j] < minn[i][d2.back()]) d2.pop_back();
d.push_back(j);
d2.push_back(j);
int diff = maxx[i][d.front()] - minn[i][d2.front()];
if (diff < minim){
minim = diff;
cnt = 1;
}
else if (diff == minim){
++cnt;
}
}
}
}
int main(){
fin >> n >> m >> p;
for (int i = 1; i <= n; ++i){
for (int j = 1; j <= m; ++j){
fin >> mat[i][j];
}
}
while (p--){
int x, y;
fin >> x >> y;
minim = 1e9;
cnt = 0;
if (x == y){
Solve(x, y);
}
else{
Solve(x, y);
Solve(y, x);
}
fout << minim << " " << cnt << "\n";
}
fin.close();
fout.close();
return 0;
}