Pagini recente » Cod sursa (job #1059381) | Cod sursa (job #2738980) | Cod sursa (job #3243930) | Cod sursa (job #2666652) | Cod sursa (job #1219157)
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
int t[1005][1005];
int mint[1005][1005];
int maxt[1005][1005];
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;
}
}
}
}
void brut(int x, int y) {
for(int i = 1; i + x - 1<= m; ++i)
for(int j = 1; j + y - 1 <= n; ++j) {
int mic = 8000, mare = 0;
for(int a = i; a <= i + x - 1; ++a)
for(int b = j; b <= j + y - 1; ++b) {
if(t[a][b] > mare) mare = t[a][b];
if(t[a][b] < mic) mic = t[a][b];
}
if(mare - mic < minh) {
minh = mare - mic;
nr = 1;
}
else if(mare - mic == 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;
if(x == y) brut(x, y);
else {
rez(x, y);
if(x != y)
rez(y, x);
}
cout << minh << ' ' << nr << '\n';
}
return 0;
}