Cod sursa(job #481332)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 31 august 2010 12:45:27
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include<fstream>
#include <deque>
#define Nmax 1002
#define idx first
#define val second
#define mp make_pair
#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],p[Nmax],u[Nmax],p2[Nmax],u2[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(j=1;j<=m;++j) p[j]=p2[j]=1, u[j]=u2[j]=0;
	for(i=1;i<=n;++i){
		for(j=1;j<=m;++j){
			while(u[j]>=p[j] && A[Max[j][u[j]]][j] < A[i][j])
				u[j]--;
			Max[j][++u[j]]=i;
			while(u2[j]>=p2[j] && A[Min[j][u2[j]]][j] > A[i][j])
				u2[j]--;
			Min[j][++u2[j]]=i;
			
			while( Max[j][p[j]]+dx-1<i ) p[j]++;
			while( Min[j][p2[j]]+dx-1<i ) p2[j]++;
		}
		if( i>=dx ){
			pm=pM=1; um=uM=0;
			for(j=1;j<=m;++j){
				while( uM>=pM && A[Max[dM[uM]][p[dM[uM]]]][dM[uM]]<A[Max[j][p[j]]][j])
					uM--;
				dM[++uM]=j;
				while( um>=pm && A[Min[dm[um]][p2[dm[um]]]][dm[um]]>A[Min[j][p2[j]]][j])
					um--;
				dm[++um]=j;
				
				while( dM[pM]+dy-1<j ) pM++;
				while( dm[pm]+dy-1<j ) pm++;
				
				if(j>=dy){
					if( A[Max[dM[pM]][p[dM[pM]]]][dM[pM]]-
						A[Min[dm[pm]][p2[dm[pm]]]][dm[pm]] < min_val ){
							min_val=A[Max[dM[pM]][p[dM[pM]]]][dM[pM]]-
									A[Min[dm[pm]][p2[dm[pm]]]][dm[pm]];
							nr=1;
						} else
					if(A[Max[dM[pM]][p[dM[pM]]]][dM[pM]]-
						A[Min[dm[pm]][p2[dm[pm]]]][dm[pm]] == 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;
}