Pagini recente » Cod sursa (job #1097353) | Cod sursa (job #1884039) | Cod sursa (job #1752298) | Cod sursa (job #1679117) | Cod sursa (job #1219147)
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
int t[1001][1001];
int mint[1001][1001];
int maxt[1001][1001];
deque<int> dqmin;
deque<int> dqmax;
int m, n, p, x, y, minh = 8000, nr;
void rez(int x, int y) {
for(int a = 1; a <= m; ++a) {
dqmin.clear();
dqmax.clear();
for(int b = 1; b <= n; ++b) {
while(!dqmin.empty() && t[a][dqmin.back()] > t[a][b]) dqmin.pop_back();
dqmin.push_back(b);
if(b - dqmin.front() == x) dqmin.pop_front();
while(!dqmax.empty() && t[a][dqmax.back()] < t[a][b]) dqmax.pop_back();
dqmax.push_back(b);
if(b - dqmax.front() == x) dqmax.pop_front();
if(b >= x) mint[a][b - x + 1] = t[a][dqmin.front()], maxt[a][b - x + 1] = t[a][dqmax.front()];
}
}
for(int b = 1; b <= n - x + 1; ++b) {
dqmin.clear();
dqmax.clear();
for(int a = 1; a <= m; ++a) {
while(!dqmin.empty() && mint[dqmin.back()][b] > mint[a][b]) dqmin.pop_back();
dqmin.push_back(a);
if(a - dqmin.front() == y) dqmin.pop_front();
while(!dqmax.empty() && maxt[dqmax.back()][b] < maxt[a][b]) dqmax.pop_back();
dqmax.push_back(a);
if(b - dqmax.front() == y) dqmax.pop_front();
if(a >= y) {
if(maxt[dqmax.front()][b] - mint[dqmin.front()][b] < minh) {
minh = maxt[dqmax.front()][b] - mint[dqmin.front()][b];
nr = 1;
}
else if(maxt[dqmax.front()][b] - mint[dqmin.front()][b] == minh) ++nr;
}
}
}
}
int main()
{
ifstream cin("struti.in");
ofstream cout("struti.out");
cin >> m >> n >> p;
for(int i = 1; i <= m; ++i)
for(int j = 1; j <= n; ++j)
cin >> t[i][j];
for(int i = 1; i <= p; ++i) {
cin >> x >> y;
nr = 0, minh = 8000;
rez(x, y);
if(x != y) rez(y, x);
cout << minh << ' ' << nr << '\n';
}
return 0;
}