Cod sursa(job #481362)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 31 august 2010 14:20:41
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<fstream>
#define Nmax 1002
#define INF 2147000000

using namespace std;

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

int A[Nmax][Nmax],Max[Nmax][Nmax],Min[Nmax][Nmax];
int dM[Nmax],dm[Nmax];
int n,m,t,min_val,nr;

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

void solve(int dx,int dy){
	int i,j,pm,um,pM,uM;

	for(i=1;i<=n;++i){
		pm=pM=1; um=uM=0;
		for(j=1;j<=m;++j){
			while(uM>=pM && A[i][dM[uM]] < A[i][j])
				uM--;
			dM[++uM]=j; 
			while(um>=pm && A[i][dm[um]] > A[i][j])
				um--;
			dm[++um]=j; 
			
			while( dM[pM]+dy-1<j ) pM++;
			while( dm[pm]+dy-1<j ) pm++;

			Max[i][j]=A[i][dM[pM]];
			Min[i][j]=A[i][dm[pm]];
		}
	}
	for(j=dy;j<=m;++j){
		pm=pM=1; um=uM=0;
		for(i=1;i<=n;++i){
			while(uM>=pM && Max[dM[uM]][j] < Max[i][j])
				uM--;
			dM[++uM]=i;
			while(um>=pm && Min[dm[um]][j] > Min[i][j])
				um--;
			dm[++um]=i;
			
			while(dM[pM]+dx-1<i) pM++;
			while(dm[pm]+dx-1<i) pm++;
			
			if(i>=dx)
				if( Max[dM[pM]][j]-Min[dm[pm]][j] < min_val ){
					min_val=Max[dM[pM]][j]-Min[dm[pm]][j];
					nr=1;
				}else
				if( Max[dM[pM]][j]-Min[dm[pm]][j] == 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;
}