Pagini recente » Cod sursa (job #93926) | Cod sursa (job #900460) | Cod sursa (job #914926) | Cod sursa (job #1615128) | Cod sursa (job #916613)
Cod sursa(job #916613)
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <deque>
using namespace std;
#define forv(i, v) for(size_t i = 0; i < (v).size(); i++)
#define forit(it, v) for(typeof((v).begin()) it = (v).begin(); it != (v).end(); it++)
#define mp make_pair
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define mp make_pair
#define all(x) x.begin(), x.end()
typedef long double lod;
typedef long long lol;
typedef pair<int, int> pii;
const int SMAX = 1024 * 1024;
char buff[SMAX];
inline int nextInt()
{
static int I = SMAX; int ret = 0;
if (I == SMAX) fread(buff, 1, SMAX, stdin), I = 0;
while (!isdigit(buff[I]))
if (++I == SMAX)
fread(buff, 1, SMAX, stdin), I = 0;
while (isdigit(buff[I]))
{
ret = ret * 10 + buff[I] - '0';
if (++I == SMAX)
fread(buff, 1, SMAX, stdin), I = 0;
}
return ret;
}
int n, m, p;
int mi[1010][1010], ma[1010][1010];
int a[1010][1010];
deque<int> Dmi, Dma;
inline pii dq(int x, int y)
{
int ret = 0x3f3f3f3f, ap = 0;
for (int j = 1; j <= m; j++)
{
Dmi.clear(); Dma.clear();
for (int i = 1; i <= n; i++)
{
for (; Dmi.size() > 0 && a[Dmi.back()][j] > a[i][j]; Dmi.ppb());
for (; Dma.size() > 0 && a[Dma.back()][j] < a[i][j]; Dma.ppb());
Dmi.pb(i); Dma.pb(i);
if (i - x == Dmi.front()) Dmi.ppf();
if (i - x == Dma.front()) Dma.ppf();
mi[i][j] = a[Dmi.front()][j];
ma[i][j] = a[Dma.front()][j];
}
}
for (int i = x; i <= n; i++)
{
Dmi.clear(); Dma.clear();
for (int j = 1; j <= m; j++)
{
for (; Dmi.size() > 0 && mi[i][Dmi.back()] > mi[i][j]; Dmi.ppb());
for (; Dma.size() > 0 && ma[i][Dma.back()] < ma[i][j]; Dma.ppb());
Dmi.pb(j); Dma.pb(j);
if (j - y == Dmi.front()) Dmi.ppf();
if (j - y == Dma.front()) Dma.ppf();
if (j >= y)
{
if (ret > ma[i][Dma.front()] - mi[i][Dmi.front()])
ret = ma[i][Dma.front()] - mi[i][Dmi.front()], ap = 1;
else
if (ret == ma[i][Dma.front()] - mi[i][Dmi.front()])
ap++;
}
}
}
return mp(ret, ap);
}
inline pii make(int x, int y)
{
pii r1 = dq(x, y), r2 = dq(y, x);
if (r1.first == r2.first && x != y)
return mp(r1.first, r1.second + r2.second);
else
return min(r1, r2);
}
int main()
{
freopen("struti.in", "r", stdin);
n = nextInt(); m = nextInt(); p = nextInt();
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
a[i][j] = nextInt();
freopen("struti.out", "w", stdout);
for (; p--; )
{
int x, y;
x = nextInt(); y = nextInt();
pii val = make(x, y);
printf("%d %d\n", val.first, val.second);
}
return 0;
}