Pagini recente » Cod sursa (job #480277) | Cod sursa (job #2060287) | Cod sursa (job #297100) | Cod sursa (job #992612) | Cod sursa (job #1106229)
#include <fstream>
#include <iostream>
using namespace std;
const int N = 1005;
const int INF = 1 << 30;
int a[N][N], mn[N][N], mx[N][N], dmin[N], dmax[N], p, n, m, MAX;
long long nr;
void solve(int dx, int dy) {
int i, j, front = 1, back = 0, p = 1, u = 0;
for(i = 0; i <= n; ++i)
for(j = 0; j <= m; ++j)
{
mx[i][j] = INF;
mn[i][j] = -INF;
}
for(i = 1; i <= n; ++i) {
front = 1; back = 0; p = 1; u = 0;
for(int j = 0; j <= max(m, n); ++j)
{
dmin[j] = 0;
dmax[j] = 0;
}
for(j = 1; j <= m; ++j) {
while(front <= back && a[i][dmin[back]] >= a[i][j])
--back;
dmin[++back] = j;
while(p <= u && a[i][dmax[u]] <= a[i][j])
--u;
dmax[++u] = j;
if(j >= dy){
mn[i][j - dy + 1] = a[i][dmin[front]];
mx[i][j - dy + 1] = a[i][dmax[p]];
}
if(dmin[back] - dmin[front] + 1 == dy)
++front;
if(dmax[u] - dmax[p] + 1 == dy)
++p;
}
}
for(int j = 1; j <= m - dy + 1; ++j) {
front = 1; back = 0; p = 1; u = 0;
for(int i = 0; i <= max(m, n); ++i)
{
dmin[i] = 0;
dmax[i] = 0;
}
for(int i = 1; i <= n; ++i) {
while(front <= back && mn[dmin[back]][j] >= mn[i][j])
--back;
dmin[++back] = i;
while(p <= u && mx[dmax[u]][j] <= mx[i][j])
--u;
dmax[++u] = i;
// cout << "DX " << dx << " " << dy << '\n';
// printf("%d %d\n", mn[dmin[front]][j], mx[dmax[p]][j]);
if(i >= dx) {
// cout << "location " << i << " " << j << "\n";
if(mx[dmax[p]][j] - mn[dmin[front]][j] == MAX)
++nr;
if(mx[dmax[p]][j] - mn[dmin[front]][j] < MAX) {
// cout << "DA\n";
// cout << dmax[p] << " " << dmin[front] << '\n';
// cout << mx[dmax[p]][j] << " " << mn[dmin[front]][j] << '\n';
MAX = mx[dmax[p]][j] - mn[dmin[front]][j];
nr = 1;
}
}
if(dmin[back] - dmin[front] + 1 == dx)
++front;
if(dmax[u] - dmax[p] + 1 == dx)
++p;
}
// printf("\n");
}
// cout << '\n';
// printf("%d\n", nr);
}
int main() {
ifstream cin("struti.in");
ofstream cout("struti.out");
cin >> n >> m >> p;
int i, j;
for(i = 1; i <= n; ++i)
for(j = 1; j <= m; ++j)
cin >> a[i][j];
for(i = 1; i <= p; ++i) {
int dx, dy;
cin >> dx >> dy;
nr = 0;
MAX = INF;
solve(dx, dy);
// cout << MAX << '\n';
if(dx != dy)
solve(dy, dx);
// cout << MAX << '\n';
cout << MAX << " " << nr << '\n';
}
return 0;
}