Pagini recente » Cod sursa (job #3359994) | Cod sursa (job #3360035) | Cod sursa (job #3360011) | Cod sursa (job #3360014) | Cod sursa (job #3360054)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <deque>
using namespace std;
int dx, dy, n, m, a[1001][1001], mini, i, j, p, x, y, nr, nrmx, nrmn, part[1001][1001], mi[1001][1001], mx[1001][1001];
deque <int> dq;
void idkmin()
{
for ( i = 1; i <= n; i++ ) {
for ( j = 1; j <= m; j++ ) {
if ( !dq.empty() && dq.front()+dy == j ) {
dq.pop_front();
}
while ( !dq.empty() && a[i][j] < a[i][dq.back()] ) {
dq.pop_back();
}
dq.push_back(j);
part[i][j] = a[i][dq.front()];
}
while ( !dq.empty() ) {
dq.pop_back();
}
}
for ( i = 1; i <= m; i++ ) {
for ( j = 1; j <= n; j++ ) {
if ( !dq.empty() && dq.front()+dx == j ) {
dq.pop_front();
}
while ( !dq.empty() && part[j][i] < part[dq.back()][i] ) {
dq.pop_back();
}
dq.push_back(j);
mi[j][i] = part[dq.front()][i];
}
while ( !dq.empty() ) {
dq.pop_back();
}
}
}
void idkmax()
{
for ( i = 1; i <= n; i++ ) {
for ( j = 1; j <= m; j++ ) {
if ( !dq.empty() && dq.front()+dy == j ) {
dq.pop_front();
}
while ( !dq.empty() && a[i][j] > a[i][dq.back()] ) {
dq.pop_back();
}
dq.push_back(j);
part[i][j] = a[i][dq.front()];
}
while ( !dq.empty() ) {
dq.pop_back();
}
}
for ( i = 1; i <= m; i++ ) {
for ( j = 1; j <= n; j++ ) {
if ( !dq.empty() && dq.front()+dx == j ) {
dq.pop_front();
}
while ( !dq.empty() && part[j][i] > part[dq.back()][i] ) {
dq.pop_back();
}
dq.push_back(j);
mx[j][i] = part[dq.front()][i];
}
while ( !dq.empty() ) {
dq.pop_back();
}
}
for ( i = dx; i <= n; i++ ) {
for ( j = dy; j <= m; j++ ) {
if ( mini > mx[i][j]-mi[i][j] ) {
mini = mx[i][j]-mi[i][j];
nr = 1;
}
else if ( mini == mx[i][j]-mi[i][j] ) {
nr++;
}
}
}
}
int main()
{
ifstream cin ("struti.in");
ofstream cout ("struti.out");
cin >> n >> m >> p;
for ( i = 1; i <= n; i++ ) {
for ( j = 1; j <= m; j++ ) {
cin >> a[i][j];
}
}
while ( p > 0 ) {
cin >> dx >> dy;
mini = 8000;
nr = 1;
idkmin();
idkmax();
if ( dx != dy ) {
swap(dx, dy);
idkmin();
idkmax();
}
cout << mini << ' ' << nr << '\n';
p--;
}
return 0;
}