Pagini recente » Cod sursa (job #2320819) | Cod sursa (job #2149954) | Cod sursa (job #1141189) | Cod sursa (job #594169) | Cod sursa (job #2409398)
#include <fstream>
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int d[1001*1001], lmin[1001][1001], lmax[1001][1001], cmin[1001][1001], cmax[1001][1001], a[1001][1001];
int n,m,mini,sol,i,j,p,u,t,dx,dy;
void solve (int dx, int dy){
for( i=1; i <= n; i++){
p=1; u=1; d[1]=1;
for ( j=2; j<=m; j++){
while (p<=u && a[i][j] <= a[i][d[u]]) u--;
d[++u]=j;
if( d[p] == j-dy ) p++;
if( j>=dy ) lmin[i][j-dy+1] = a[i][d[p]];
}
}
for( i=1; i <= n; i++){
p=1; u=1; d[1]=1;
for ( j=2; j<=m; j++){
while (p<=u && a[i][j] >= a[i][d[u]]) u--;
d[++u]=j;
if( d[p] == j-dy ) p++;
if( j>=dy ) lmax[i][j-dy+1] = a[i][d[p]];
}
}
for (j=1; j<=m-dy+1; j++){
p=1; u=1; d[1]=1;
for(i=2; i<=n; i++){
while ( p<=u && lmin[i][j] <= lmin[d[u]][j]) u--;
d[++u]=i;
if( d[p] == i-dx) p++;
if(i>=dx) cmin[i-dx+1][j] = lmin [d[p]][j];
}
}
for (j=1; j<=m-dy+1; j++){
p=1; u=1; d[1]=1;
for(i=2; i<=n; i++){
while ( p<=u && lmax[i][j] >= lmax[d[u]][j]) u--;
d[++u]=i;
if( d[p] == i-dx) p++;
if(i>=dx) cmax[i-dx+1][j] = lmax [d[p]][j];
}
}
for(i=1; i<=n-dx+1; i++)
for (j=1; j<=m-dy+1; j++){
if (cmax[i][j]-cmin[i][j]<mini)
mini=cmax[i][j]-cmin[i][j], sol=0;
if(cmax[i][j]-cmin[i][j]==mini) sol++;
}
/*g<<"lmin\n";
for(i=1; i <= n; i++, g<<"\n") for(j=1; j<=m; j++, g<< " " ) g<<lmin[i][j];
g<<"lmax\n";
for(i=1; i <= n; i++, g<<"\n") for(j=1; j<=m; j++, g<< " " ) g<<lmax[i][j];
g<<"cmin\n";
for(i=1; i <= n; i++, g<<"\n") for(j=1; j<=m; j++, g<< " " ) g<<cmin[i][j];
g<<"cmax\n";
for(i=1; i <= n; i++, g<<"\n") for(j=1; j<=m; j++, g<< " " ) g<<cmax[i][j];
g<<endl<<endl;*/
return;
}
int main()
{
f>>n>>m>>t;
for(i=1; i <= n; i++)
for(j=1; j<=m; j++)
f>>a[i][j];
for(;t--;){
f>>dx>>dy;
mini=2000000000; sol=0;
solve ( dx, dy );
if(dx!=dy) solve (dy, dx);
g << mini << " " << sol << "\n" ;
}
return 0;
}