Cod sursa(job #197131)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 1 iulie 2008 20:08:38
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<stdio.h>
#define NMAX 1000

int main(){
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int a[NMAX][NMAX]={{0}},n,m,i,j,k,dx,dy,p,nro;
int nr,min,hmin,hmax,dc,min_mn,v[8001],lstart,cstart,ii,jj,sens,t;
scanf("%d%d%d",&m,&n,&p);
if(m<=n) min_mn=m;else min_mn=n;
for(i=0;i<m;++i)
	for(j=0;j<n;++j)
		scanf("%d",&a[i][j]);
for(nro=0;nro<p;++nro){
	scanf("%d%d",&dx,&dy);
	min=0;nr=0;sens=0;
	min=8000;nr=0;
	//pe unsens
again:
	for(i=0;i<=8000;++i) v[i]=0;
	hmin=hmax=a[0][0];
	for(i=0;i<dx;++i)
		for(j=0;j<dy;++j){
			v[a[i][j]]++;
			if(hmin>a[i][j]) hmin=a[i][j];
			if(hmax<a[i][j]) hmax=a[i][j];
			}
	dc=hmax-hmin;
	if(min>dc) {min=dc;nr=1;}
	else if(min==dc) nr++;
	for(i=dx-1;i<m;++i){
		lstart=i-dx+1;
		if(lstart){
			for(k=0;k<dy;++k) v[a[lstart-1][k]]--;
			if(v[hmin]==0){
				ii=hmin+1;
				while(v[ii]==0) ii++;
				hmin=ii;
			}
			if(v[hmax]==0){
				jj=hmax-1;
				while(v[jj]==0) jj--;
				hmax=jj;
			}
			for(k=0;k<dy;++k) {
				v[a[i][k]]++;
				if(hmin>a[i][k]) hmin=a[i][k];
				if(hmax<a[i][k]) hmax=a[i][k];
				}
			dc=hmax-hmin;
			if(dc<min){min=dc;nr=1;}
			else if(dc==min) nr++;
			}
		for(j=dy;j<n;++j){
			cstart=j-dy;
			for(k=lstart;k<=i;++k) v[a[k][cstart]]--;
			if(v[hmin]==0){
				ii=hmin+1;
				while(v[ii]==0) ii++;
				hmin=ii;
			}
			if(v[hmax]==0){
				jj=hmax-1;
				while(v[jj]==0) jj--;
				hmax=jj;
			}
			for(k=lstart;k<=i;++k) {
				v[a[k][j]]++;
				if(hmin>a[k][j]) hmin=a[k][j];
				if(hmax<a[k][j]) hmax=a[k][j];
				}
			dc=hmax-hmin;
			if(dc<min){min=dc;nr=1;}
			else if(dc==min) nr++;
			}
		}
	if(sens==0){t=dx;dx=dy;dy=t;sens=1;goto again;}

	printf("%d %d\n",min,nr);
	}
return 0;
}