Cod sursa(job #460427)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 2 iunie 2010 16:22:03
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.96 kb
#include<stdio.h>
#include<string>
FILE*f=fopen("struti.in","r");
FILE*g=fopen("struti.out","w");
int n,m,p,i,j,a[1005][1005],deque[1005],dx,dy,maxim[1005][1005],ii,prelmax[1005][1005];
int front, back,minim[1005][1005],prelmin[1005][1005],aux,nr,min; int deque2[1005];
int main () {
	fscanf(f,"%d %d %d",&n,&m,&p);
	for( i = 1; i <= n ; ++i )
		for ( j = 1 ; j <= m ; ++j)
			fscanf ( f, "%d" , &a[i][j]);
	
	for ( ii = 1; ii <= p ; ii++){
		fscanf( f, "%d %d ",&dx,&dy);
		
		min = 9999999; nr = 0;
		
		for ( j = 1; j <= m ; ++j){
			front = 1; back = 0; memset(deque,0,sizeof(deque));
			//front2 = 1; back2 = 0; memset(deque2,0,sizeof(deque2));
			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)
					maxim[i-dx+1][j] = a [ deque[front]][j];
				
				/*while(front2 <= back && a[i][j] > a[deque2[back2]][j])
					back --;
				
				deque2 [++back2] = i;
				
				if( deque2[front2] == i - dy)
					front2++;
				if( i >= dy)
				
				*/
				
				
			}	
			
		}
		
		for ( i = 1; i <= n ; ++i ){
			front = 1; back = 0; memset(deque,0,sizeof(deque));
			for( j = 1 ; j <= m ; ++j) {
				
				while ( front <= back && maxim[i][j] > maxim [i][deque[back]])
					back --;
				
				deque [++back] = j;
				
				if( deque[front] == j-dy)
					front ++;
				
				if(j >= dy)
					prelmax[i][j-dy+1] = maxim[ 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)
					minim[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 && minim[i][j] < minim [i][ deque[back]])
					back --;
				
				deque[ ++back ] = j;
				
				if( deque[front] == j-dy)
					front ++;
				
				if(j >= dy)
					prelmin[i][j-dy+1] = minim[ i ][ deque[front]];
				
			}
			
		}
		
		
		//aici
		
		for( i = 1; i <= n - dx + 1 ; ++i ){
			for ( j = 1; j <= m - dy +1 ; ++j){
				if(prelmax[i][j] - prelmin [i][j] < min)
					min = prelmax[i][j] - prelmin [i][j], nr = 1;
				else
					if(prelmax[i][j] - prelmin[i][j] == min)
						nr++;
			}
		}
		
		if( dx == dy ){
			fprintf(g, "%d %d\n", min, nr);
			continue;
		}
		
		
		aux = dx;
		
		dx = dy;
		
		dy = aux;
		
		memset(prelmin,0,sizeof(prelmin));
		memset(prelmax,0,sizeof(prelmax));
		
		
		for ( j = 1; j <= m ; ++j){
			front = 1; back = 0; memset(deque,0,sizeof(deque));
			//front2 = 1; back2 = 0; memset(deque2,0,sizeof(deque2));
			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)
					maxim[i-dx+1][j] = a [ deque[front]][j];
				
				/*while(front2 <= back && a[i][j] > a[deque2[back2]][j])
					back --;
				
				deque2 [++back2] = i;
				
				if( deque2[front2] == i - dy)
					front2++;
				if( i >= dy)
				
				*/
				
				
			}	
			
		}
		
		
		
		for ( i = 1; i <= n ; ++i ){
			front = 1; back = 0; memset(deque,0,sizeof(deque));
			for( j = 1 ; j <= m ; ++j) {
				
				while ( front <= back && maxim[i][j] > maxim [i][deque[back]])
					back --;
				
				deque [++back] = j;
				
				if( deque[front] == j-dy)
					front ++;
				
				if(j >= dy)
					prelmax[i][j-dy+1] = maxim[ 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)
					minim[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 && minim[i][j] < minim [i][ deque[back]])
					back --;
				
				deque[ ++back ] = j;
				
				if( deque[front] == j-dy)
					front ++;
				
				if(j >= dy)
					prelmin[i][j-dy+1] = minim[ i ][ deque[front]];
				
			}
			
		}
		
		//aici
		
		
		for( i = 1; i <= n - dx + 1 ; ++i ){
			for ( j = 1; j <= m - dy +1 ; ++j){
				if(prelmax[i][j] - prelmin [i][j] < min)
					min = prelmax[i][j] - prelmin [i][j], nr = 1;
				else
					if(prelmax[i][j] - prelmin[i][j] == min)
						nr++;
			}
		}
		
		
		fprintf(g, "%d %d\n", min, nr);
		
		
	}
	fclose(f);
	fclose(g);
	return 0;
}