Cod sursa(job #773816)

Utilizator GigelDaTesteTestulSuprem GigelDaTeste Data 2 august 2012 17:45:39
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include<fstream>
#include<string>
#define dim 1002
using namespace std;

ifstream f("struti.in");
ofstream g("struti.out");
int DX,DY;
int A[dim][dim],MAX[dim][dim],MAX2[dim][dim],MINU[dim][dim],MINU2[dim][dim],deque[dim],front,back,n,m,p,i,j,NR,MIN;
;
void check  (int DX,int DY ) {  

	for(j=1; j<=m; ++j ) {
		
		front=1;back=0;
		memset(deque,0,sizeof(deque));
		
		for( i=1 ; i<=n ; ++i ) {
			
			
			while(front <= back  && A[i][j]>A[deque[back]][j])
				--back;
			
			deque[++back]= i;
			
			
			if(deque[front]==i-DX)
				front++;
			
			if(i>=DX)
				MAX[i-DX+1][j]=A[deque[front]][j];
		}
	}
	
	for( i=1; i<=n; ++i) {
		
		front=1;back=0;
		memset(deque,0,sizeof(deque));
		
		for(  j=1 ;j<=m;  ++j) {
			
			while(front <= back && MAX[i][j]>MAX[i][deque[back]])
				--back;
			
			deque[++back]=j;
			
			if(deque[back]==j-DY)
				++front;
			
			if(j>=DY)
				MAX2[i][j-DY+1]=MAX[i][deque[front]];
			
		}
		
	}
	for(j=1; j<=m; ++j ) {
		
		front=1;back=0;
		memset(deque,0,sizeof(deque));
		
		for( i=1 ; i<=n ; ++i ) {
			
			
			while(front <= back  && A[i][j]<A[deque[back]][j])
				--back;
			
			deque[++back]=i;
			
			
			if(deque[front]==i-DX)
				front++;
			
			if(i>=DX)
				MINU[i-DX+1][j]=A[deque[front]][j];
		}
	}
	
	for( i=1; i<=n; ++i) {
		
		front=1;back=0;
		memset(deque,0,sizeof(deque));
		
		for(  j=1 ;j<=m;  ++j) {
			
			while(front <= back && MINU[i][j]<MINU[i][deque[back]])
				--back;
			
			deque[++back]=j;
			
			if(deque[back]==j-DY)
				++front;
			
			if(j>=DY)
				MINU2[i][j-DY+1]=MINU[i][deque[front]];
			
		}
		
	}
	for(i=1;i<=n-DX+1;++i) {
		
		for(j=1;j<=m-DY+1; ++j ) {
			
			if(MIN>MAX2[i][j]-MINU2[i][j]){
				MIN=MAX2[i][j]-MINU2[i][j];
				NR=1;
			}
			else
				if(MIN==MAX2[i][j]-MINU2[i][j])
					NR++;
			
		}
		
	}
}	
int main (){
	
	f>>n>>m>>p;
	
	for( i=1 ; i<=n ; ++i )
		for( j=1 ; j<=m ;++j)
			f>>A[i][j];
	
	for(;p;--p) {
		f>>DX>>DY;
		MIN=8007;
		
		memset(MAX2,0,sizeof(MAX2));
		memset(MINU2,0,sizeof(MINU2));
		
		check(DX,DY);
		
		if(DX!=DY){
			memset(MAX2,0,sizeof(MAX2));
			memset(MINU2,0,sizeof(MINU2));
			
			check(DY,DX);
		}
		g<<MIN<<" "<<NR<<"\n";
	}
	return 0;
}