Cod sursa(job #481298)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 31 august 2010 11:36:30
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <stdio.h>
#include <deque>
#define Nmax 1002
#define idx first
#define val second
#define mp make_pair
#define INF 2147000000

using namespace std;

deque< pair<int,int> > max_deq[Nmax],min_deq[Nmax],deqM,deqm;
int A[Nmax][Nmax];
int N,M,T,min_val,nr;

inline int Minim(int x,int y){ return x<y ? x:y;}

void adaug_max(deque< pair<int,int> >& deq,int i,int wh){
	while( !deq.empty() && deq.back().val < wh )
		deq.pop_back();
	deq.push_back(mp(i,wh));
}
void adaug_min(deque< pair<int,int> >& deq,int i,int wh){
	while( !deq.empty() && deq.back().val > wh )
		deq.pop_back();
	deq.push_back(mp(i,wh));
}
void pop(deque< pair<int,int> >& deq,int d,int lim){
	while( !deq.empty() && deq.front().idx+d-1 < lim )
		deq.pop_front();
}

void solve(int dx,int dy){
	int i,j;
	//initialiez
	for(j=1;j<=M;++j){
		while(!min_deq[j].empty()) min_deq[j].pop_back();
		while(!max_deq[j].empty()) max_deq[j].pop_back();
	}
	for(i=1;i<dx;++i) 
		for(j=1;j<=M;++j){
			adaug_max(max_deq[j],i,A[i][j]);
			adaug_min(min_deq[j],i,A[i][j]);
		}
	
	for(i=dx;i<=N;++i){
		for(j=1;j<=M;++j){
			// adaug la sf deq
			adaug_max(max_deq[j],i,A[i][j]);
			adaug_min(min_deq[j],i,A[i][j]);
			
			// scot din fata
			pop(max_deq[j],dx,i);
			pop(min_deq[j],dx,i);
		}
		
		//initializez
		while( !deqM.empty() ) deqM.pop_back();
		while( !deqm.empty() ) deqm.pop_back();
		for(j=1;j<dy;++j){
			adaug_max(deqM,j,max_deq[j].front().val);
			adaug_min(deqm,j,min_deq[j].front().val);
		}
		
		for(j=dy;j<=M;++j){
			// adaug la sf deq 
			adaug_max(deqM,j,max_deq[j].front().val);
			adaug_min(deqm,j,min_deq[j].front().val);
			
			// scot din fata
			pop(deqM,dy,j);
			pop(deqm,dy,j);
			
			if( deqM.front().val-deqm.front().val < min_val ){
				min_val=deqM.front().val-deqm.front().val;
				nr=1;
			}else
			if( deqM.front().val-deqm.front().val == min_val )
				nr++;
		}
	}
}	

int main(){
	int dx,dy,i,j;
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	scanf("%d%d%d",&N,&M,&T);
	for(i=1;i<=N;++i)
		for(j=1;j<=M;++j) scanf("%d",&A[i][j]);
	
	for(; T; --T){
		scanf("%d%d",&dx,&dy);
		min_val=INF; nr=0;
		
		solve(dx,dy);
		if( dx!=dy ) solve(dy,dx);
		printf("%d %d\n",min_val,nr);
	}
	
	fclose(stdin); fclose(stdout);
	return 0;
}