Cod sursa(job #481305)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 31 august 2010 12:10:12
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 kb
#include <fstream>
#include <deque>
#define Nmax 1002
#define INF 2147000000

using namespace std;

ifstream fin("struti.in");
ofstream fout("struti.out");

deque< 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;}

inline void adaug_max(deque< int >& deq,int i,int j){
	while( !deq.empty() && A[deq.back()][j] < A[i][j] )
		deq.pop_back();
	deq.push_back(i);
}
inline void adaug_min(deque< int >& deq,int i,int j){
	while( !deq.empty() && A[deq.back()][j] > A[i][j] )
		deq.pop_back();
	deq.push_back(i);
}

inline void adaug_max2(deque< int >& deq,int j){
	while( !deq.empty()
		&& A[max_deq[deq.back()].front()][deq.back()] < A[max_deq[j].front()][j] )
		deq.pop_back();
	deq.push_back(j);
}
inline void adaug_min2(deque< int >& deq,int j){
	while( !deq.empty()  
		&& A[min_deq[deq.back()].front()][deq.back()] > A[min_deq[j].front()][j] )
		deq.pop_back();
	deq.push_back(j);
}

inline void pop(deque< int >& deq,int d,int lim){
	while( !deq.empty() && deq.front()+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,j);
			adaug_min(min_deq[j],i,j);
		}
	
	for(i=dx;i<=N;++i){
		for(j=1;j<=M;++j){
			// adaug la sf deq
			adaug_max(max_deq[j],i,j);
			adaug_min(min_deq[j],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_max2(deqM,j);
			adaug_min2(deqm,j);
		}
		
		for(j=dy;j<=M;++j){
			// adaug la sf deq 
			adaug_max2(deqM,j);
			adaug_min2(deqm,j);
			
			// scot din fata
			pop(deqM,dy,j);
			pop(deqm,dy,j);
			
			if( A[max_deq[deqM.front()].front()][deqM.front()]-
				A[min_deq[deqm.front()].front()][deqm.front()] < min_val )
				{
				min_val=A[max_deq[deqM.front()].front()][deqM.front()]-
						A[min_deq[deqm.front()].front()][deqm.front()];
				nr=1;
			}else
			if(A[max_deq[deqM.front()].front()][deqM.front()]-
				A[min_deq[deqm.front()].front()][deqm.front()] == min_val  )
				nr++;
		}
	}
}	

int main(){
	int dx,dy,i,j;
	fin>>N>>M>>T;
	for(i=1;i<=N;++i)
		for(j=1;j<=M;++j) fin>>A[i][j];
	
	for(; T; --T){
		fin>>dx>>dy;
		min_val=INF; nr=0;
		
		solve(dx,dy);
		if( dx!=dy ) solve(dy,dx);
		fout<<min_val<<" "<<nr<<"\n";
	}
	
	fin.close(); fout.close();
	return 0;
}