Pagini recente » Cod sursa (job #2908559) | Cod sursa (job #2924395) | Cod sursa (job #2388677) | Cod sursa (job #428224) | Cod sursa (job #2906237)
//interesant
#include <fstream>
#include <vector>
#include <climits>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
ifstream cin("struti.in");
ofstream cout("struti.out");
int mn, cnt;
struct ceva
{
int mn, mx;
int val;
} v[1003][1003];
int dmin[1003], dmax[1003], n, m;
void solve(int a, int b)
{
int i, j, stmin, drmin, stmax, drmax;
for (j = 1; j <= m; j++)
{
stmin = stmax = 1;
drmin = drmax = 0;
for (i = 1; i <= a; i++)
{
while (stmin <= drmin and v[i][j].val < v[dmin[drmin]][j].val)
drmin--;
while (stmax <= drmax and v[i][j].val > v[dmax[drmax]][j].val)
drmax--;
dmax[++drmax] = i;
dmin[++drmin] = i;
v[i][j].mn = v[dmin[stmin]][j].val;
v[i][j].mx = v[dmax[stmax]][j].val;
}
for (i = a + 1; i <= n; i++)
{
while (stmin <= drmin and dmin[stmin] <= i - a)
stmin++;
while (stmax <= drmax and dmax[stmax] <= i - a)
stmax++;
while (stmin <= drmin and v[i][j].val < v[dmin[drmin]][j].val)
drmin--;
while (stmax <= drmax and v[i][j].val > v[dmax[drmax]][j].val)
drmax--;
dmax[++drmax] = i;
dmin[++drmin] = i;
v[i][j].mn = v[dmin[stmin]][j].val;
v[i][j].mx = v[dmax[stmax]][j].val;
}
}
/*for (i = 1; i <= n; i++, cout << "\n")
for (j = 1; j <= m; j++)
cout << v[i][j].mn << " ";
cout << "\n\n\n";
for (i = 1; i <= n; i++, cout << "\n")
for (j = 1; j <= m; j++)
cout << v[i][j].mx << " ";*/
for (i = a; i <= n; i++)
{
drmax = drmin = 0;
stmax = stmin = 1;
for (j = 1; j <= b; j++)
{
while (stmin <= drmin and v[i][j].mn < v[i][dmin[drmin]].mn)
drmin--;
while (stmax <= drmax and v[i][j].mx > v[i][dmax[drmax]].mx)
drmax--;
dmax[++drmax] = j;
dmin[++drmin] = j;
}
if (mn > v[i][dmax[stmax]].mx - v[i][dmin[stmin]].mn)
{
mn = v[i][dmax[stmax]].mx - v[i][dmin[stmin]].mn;
cnt = 1;
}
else
cnt += (mn == v[i][dmax[stmax]].mx - v[i][dmin[stmin]].mn);
for (j = b + 1; j <= m; j++)
{
while (stmin <= drmin and dmin[stmin] <= j - b)
stmin++;
while (stmax <= drmax and dmax[stmax] <= j - b)
stmax++;
while (stmin <= drmin and v[i][j].mn < v[i][dmin[drmin]].mn)
drmin--;
while (stmax <= drmax and v[i][j].mx > v[i][dmax[drmax]].mx)
drmax--;
dmax[++drmax] = j;
dmin[++drmin] = j;
if (mn > v[i][dmax[stmax]].mx - v[i][dmin[stmin]].mn)
{
mn = v[i][dmax[stmax]].mx - v[i][dmin[stmin]].mn;
cnt = 1;
}
else
cnt += (mn == v[i][dmax[stmax]].mx - v[i][dmin[stmin]].mn);
}
}
}
int main()
{
int p, i, j;
cin >> n >> m >> p;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
cin >> v[i][j].val;
while (p--)
{
int a, b;
cin >> a >> b;
mn = INT_MAX;
cnt = 0;
solve(a, b);
//return 0;
if (a != b)
solve(b, a);
cout << mn << ' ' << cnt << "\n";
}
}