Pagini recente » Cod sursa (job #1486104) | Cod sursa (job #2016224) | Cod sursa (job #2168666) | Cod sursa (job #424330) | Cod sursa (job #1496265)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <deque>
#define inf 2000000000
#define Nmax 1005
using namespace std;
int n, m, nr, t, dx, dy, sol;
int a[Nmax][Nmax];
int d[Nmax][Nmax], e[Nmax][Nmax];
class InputReader
{
public:
InputReader() {}
InputReader(const char *file_name)
{
input_file = fopen(file_name, "r");
cursor = 0;
fread(buffer, SIZE, 1, input_file);
}
inline InputReader &operator >>(int &n)
{
while(buffer[cursor] < '0' || buffer[cursor] > '9')
{
advance();
}
n = 0;
while('0' <= buffer[cursor] && buffer[cursor] <= '9')
{
n = n * 10 + buffer[cursor] - '0';
advance();
}
return *this;
}
private:
FILE *input_file;
static const int SIZE = 1 << 17;
int cursor;
char buffer[SIZE];
inline void advance()
{
++ cursor;
if(cursor == SIZE)
{
cursor = 0;
fread(buffer, SIZE, 1, input_file);
}
}
};
void solve (int dx,int dy)
{
int i, j, p, q;
deque < int > dc,ec;
dc.clear();
ec.clear();
for (i = 1; i <= n; ++ i)
{
dc.clear();
ec.clear();
for (j = 1; j <= m; ++ j)
{
while (!dc.empty() && a[i][dc.back()]>a[i][j])
dc.pop_back();
dc.push_back(j);
if (j-dc.front()==dx) dc.pop_front();
d[i][j]=dc.front();
while (!ec.empty() && a[i][ec.back()]<a[i][j])
ec.pop_back();
ec.push_back(j);
if (j-ec.front()==dx) ec.pop_front();
e[i][j]=ec.front();
}
}
dc.clear();
ec.clear();
for (j = 1; j <= m; ++ j)
{
dc.clear();
ec.clear();
for (i=1; i<=n; i++)
{
while (!dc.empty() && a[dc.back()][d[dc.back()][j]]>a[i][d[i][j]])
dc.pop_back();
dc.push_back(i);
if (i-dc.front()==dy) dc.pop_front();
while (!ec.empty() && a[ec.back()][e[ec.back()][j]]<=a[i][e[i][j]])
ec.pop_back();
ec.push_back(i);
if (i-ec.front()==dy) ec.pop_front();
if (i>=dy && j>=dx)
{
p=a[ec.front()][e[ec.front()][j]];
q=a[dc.front()][d[dc.front()][j]];
if (p-q<sol)
sol=p-q,nr=1;
else if (p-q==sol)
++nr;
}
}
}
}
void rsw()
{
int i, j;
InputReader cin("struti.in");
freopen("struti.out","w",stdout);
cin >> n >> m >> t;
++ t;
for (i = 1; i <= n; ++ i)
for (j = 1; j <= m; ++ j)
cin >> a[i][j];
while (-- t)
{
cin >> dx >> dy;
sol = inf;
solve(dx,dy);
if (dy != dx)
solve(dy,dx);
printf("%d %d\n",sol,nr);
}
}
int main()
{
rsw();
return 0;
}