Pagini recente » Cod sursa (job #2454516) | Cod sursa (job #1268258) | Cod sursa (job #2097816) | Cod sursa (job #3244190) | Cod sursa (job #2269238)
#include <bits/stdc++.h>
#define INF 1000000000
using namespace std;
deque <int> dmin[1005];
deque <int> dmax[1005];
deque <int> solmax;
deque <int> solmin;
const int bsize = 1<<23;
char ch[bsize+1];
int n, m, p, a, b, nr, Min, pos;
int v[1005][1005];
void read (int &x)
{
x = 0;
while (!isdigit(ch[pos]))
{
pos++;
if (pos == bsize)
{
pos = 0;
fread(ch, 1, bsize, stdin);
}
}
while (isdigit(ch[pos]))
{
x = x * 10 + ch[pos] - '0';
pos++;
if (pos == bsize)
{
pos++;
fread(ch, 1, bsize, stdin);
}
}
}
void solve (int lin, int col)
{
for (int j = 1; j < col; j++)
{
for (int i = 1; i <= n; i++)
{
while (!dmin[i].empty() && v[i][dmin[i].back()] >= v[i][j])
{
dmin[i].pop_back();
}
dmin[i].push_back(j);
if (j - dmin[i].front() == col) dmin[i].pop_front();
while (!dmax[i].empty() && v[i][dmax[i].back()] <= v[i][j])
{
dmax[i].pop_back();
}
dmax[i].push_back(j);
if (j - dmax[i].front() == col) dmax[i].pop_front();
}
}
for (int j = col; j <= m; j++)
{
for (int i = 1; i <= n; i++)
{
while (!dmin[i].empty() && v[i][dmin[i].back()] >= v[i][j])
{
dmin[i].pop_back();
}
dmin[i].push_back(j);
if (j - dmin[i].front() == col) dmin[i].pop_front();
while (!dmax[i].empty() && v[i][dmax[i].back()] <= v[i][j])
{
dmax[i].pop_back();
}
dmax[i].push_back(j);
if (j - dmax[i].front() == col) dmax[i].pop_front();
}
solmax.clear();
solmin.clear();
for (int i = 1; i <= n; i++)
{
while (!solmin.empty() && v[i][dmin[i].front()] <= v[solmin.back()][dmin[solmin.back()].front()])
{
solmin.pop_back();
}
solmin.push_back(i);
if (i - solmin.front() == lin) solmin.pop_front();
while (!solmax.empty() && v[i][dmax[i].front()] >= v[solmax.back()][dmax[solmax.back()].front()])
{
solmax.pop_back();
}
solmax.push_back(i);
if (i - solmax.front() == lin)
{
solmax.pop_front();
}
if (i >= lin)
{
if (v[solmax.front()][dmax[solmax.front()].front()] - v[solmin.front()][dmin[solmin.front()].front()] < Min)
{
nr = 1;
Min = v[solmax.front()][dmax[solmax.front()].front()] - v[solmin.front()][dmin[solmin.front()].front()];
}
else if (v[solmax.front()][dmax[solmax.front()].front()] - v[solmin.front()][dmin[solmin.front()].front()] == Min)
{
nr++;
}
}
}
}
for (int i = 1; i <= n; i++)
{
dmin[i].clear();
dmax[i].clear();
}
}
int main()
{
freopen("struti.in", "r", stdin);
freopen("struti.out", "w", stdout);
ios_base :: sync_with_stdio(false);
fread(ch, 1, bsize, stdin);
pos = 0;
read(n);
read(m);
read(p);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
read(v[i][j]);
}
for (; p; p--)
{
read(a);
read(b);
Min = INF;
nr = 0;
solve(a, b);
if (a != b)
{
solve(b, a);
}
cout << Min << " " << nr << '\n';
}
return 0;
}