Cod sursa(job #2409398)

Utilizator mihnea.anghelMihnea Anghel mihnea.anghel Data 18 aprilie 2019 23:06:46
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#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;
}