Cod sursa(job #209769)

Utilizator CezarMocanCezar Mocan CezarMocan Data 24 septembrie 2008 17:01:07
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.09 kb
#include <cstdio>
#include <cstring>

using namespace std;

int dxx,dyy,p,d[1010],s,v1[1010],v2[1010],vmax[1010],vmin[1010];
int dm,dm1,dm2,sx[1010],jx[1010],sn[1010],jn[1010],sus,jos,rmax[1010],rmin[1010];
int sol,sol1,sol2;
short int v[1010][1010],i,j,n,m,dx[1010][1010],dn[1010][1010];
char str[1500000];

void barbut(int dxx, int dyy){
	int i,j;
	for (i=1;i<=m;i++){
        sx[i]=jx[i]=sn[i]=jn[i]=1;
        dx[1][i]=1;
        dn[1][i]=1;   
    }
    
    for (i=2;i<=n;i++){
        if (i>dxx){
            for (j=1;j<=m;j++){
                while ((dx[jx[j]][j]<=(i-dxx))&&(jx[j]<=sx[j]))
                    jx[j]++;
                while ((dn[jn[j]][j]<=(i-dxx))&&(jn[j]<=sn[j]))
                    jn[j]++;
            }
        }    
        
        for (j=1;j<=m;j++){
            while ((v[i][j]>v[dx[sx[j]][j]][j])&&(sx[j]>=jx[j]))
                sx[j]--;    
            sx[j]++;
            dx[sx[j]][j]=i;
            while ((v[i][j]<v[dn[sn[j]][j]][j])&&(sn[j]>=jn[j]))
                sn[j]--;    
            sn[j]++;
            dn[sn[j]][j]=i;
            vmax[j]=v[dx[jx[j]][j]][j];
	    vmin[j]=v[dn[jn[j]][j]][j];
	}       
        if (i>=dxx){
            jos=sus=1;
            d[1]=1;           
            for (j=2;j<=m;j++){
                if (j>dyy)
                   while ((d[jos]<=j-dyy)&&(jos<=sus))
                         jos++;      
                while ((vmax[j]>vmax[d[sus]])&&(sus>=jos))
                      sus--;
                sus++;
                d[sus]=j;
                if (j>=dyy)
                   rmax[j]=vmax[d[jos]];
            }
            jos=sus=1;
            d[1]=1;            
            for (j=2;j<=m;j++){
                if (j>dyy)
                   while ((d[jos]<=j-dyy)&&(jos<=sus))
                         jos++;      
                while ((vmin[j]<vmin[d[sus]])&&(sus>=jos))
                      sus--;
                sus++;
                d[sus]=j;
                if (j>=dyy)
                   rmin[j]=vmin[d[jos]];
            }
            for (j=dyy;j<=m;j++){

				if ((rmax[j]-rmin[j])==dm)
		   			sol++;
				if ((rmax[j]-rmin[j])<dm){
		   			dm=rmax[j]-rmin[j];

             	   sol=1;                      
            	}
                                        
                
            }
            
        }
    }
}

int main(){
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	
	scanf("%hd%hd%d ",&n,&m,&p);

	int nr,sz;
	
	for (i=1;i<=n;i++){
		fgets(str,1100000,stdin);
		nr=1;
		sz=strlen(str);
		for (j=0;j<sz;j++){
			if ((str[j]>='0')&&(str[j]<='9'))
				v[i][nr]=v[i][nr]*10+str[j]-48;
			else
				nr++;
		}
		
	}


	for (i=1;i<=p;i++){
		scanf("%d%d",&dxx,&dyy);
	
		if ((dxx==1)&&(dyy==1))
			printf("0 %d\n",n*m);
		
		else {
		
			dm=dm1=dm2=2000000000;
			sol=0;
		
			barbut(dxx,dyy);
			dm1=dm;
			sol1=sol;

			if (dxx!=dyy){

				dm=2000000000;
				sol=0;

				barbut(dyy,dxx);
				dm2=dm;
				sol2=sol;
				}

			if (dm1==dm2){
				sol=sol1+sol2;
				dm=dm1;
			}
	
			if (dm1<dm2){
				sol=sol1;
				dm=dm1;
			}

			if (dm2<dm1){
				sol=sol2;
				dm=dm2;
			}
			printf("%d %d\n",dm,sol);
		}
	}	
return 0;
}