Pagini recente » Cod sursa (job #342066) | Cod sursa (job #3040801) | Cod sursa (job #1331678) | Cod sursa (job #699786) | Cod sursa (job #1077109)
#include <fstream>
using namespace std;
int n, i, j, dx, dy, nrs, rz, a[1005][1005], dq1[1005], dq2[1005], b[1005][1005][2], m, p;
void solve(int dx, int dy)
{
int i, j, s1, s2, f1, f2;
for (i = 1; i <= n; i ++)
{
s1 = 1; s2 = 1; f1 = 0; f2 = 0;
for (j = 1; j <= m; j ++)
{
while( s1 <= f1 && a[i][j] <= a[i][dq1[f1]] ) --f1;
dq1[++f1] = j;
if( dq1[s1] <= j - dx ) ++s1;
while( s2 <= f2 && a[i][j] >= a[i][dq2[f2]] ) --f2;
dq2[++f2] = j;
if( dq2[s2] <= j - dx ) ++s2;
if( j >= dx)
{
b[i][j - dx + 1][0] = a[i][dq1[s1]];
b[i][j - dx + 1][1] = a[i][dq2[s2]];
}
}
}
int qs1, qs2, qf1, qf2;
for (j = 1; j <= m - dx + 1; j ++)
{
s1 = 1; s2 = 1; f1 = 0; f2 = 0;
for (i = 1; i <= n; i ++)
{
while( s1 <= f1 && b[i][j][0] <= b[dq1[f1]][j][0] ) --f1;
dq1[++f1] = i;
if( dq1[s1] <= i - dy ) ++s1;
while( s2 <= f2 && b[i][j][1] >= b[dq2[f2]][j][1] ) --f2;
dq2[++f2] = i;
if( dq2[s2] <= i - dy ) ++s2;
if (i >= dy){
if (b[dq2[s2]][j][1] - b[dq1[s1]][j][0] < rz)
{
rz = b[dq2[s2]][j][1] - b[dq1[s1]][j][0];
nrs = 0;
}
if (b[dq2[s2]][j][1] - b[dq1[s1]][j][0] == rz)
nrs ++;
}
}
}
}
int main()
{
ifstream fin("struti.in");
ofstream fout("struti.out");
fin>>n>>m>>p;
for (i = 1; i <= n; i ++)
for (j = 1; j <= m; j ++)
fin>>a[i][j];
for(int i = 1; i<= p; ++i)
{
fin>>dx>>dy;
rz = 1000000;
solve(dx, dy);
if (dx != dy)
solve(dy, dx);
fout<<rz<<" "<<nrs<<"\n";
}
return 0;
}