Cod sursa(job #377865)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 26 decembrie 2009 18:29:32
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.77 kb
#include<iostream>
#include<string>
#include<ctime>

using namespace std;

FILE*fin=fopen("struti.in","r");
FILE*fout=fopen("struti.out","w");

#define nm 1002
#define inf 10000
#define si short int
#define maxbuf 65536

si a[nm][nm],deql[nm][nm],deqh[nm][nm],indl[nm][nm],indh[nm][nm];
si dl[nm],dh[nm],il[nm],ih[nm],stl[nm],sth[nm],drl[nm],drh[nm];
si n,m,p;

int ans,nr,ind,ind2;

char buf[maxbuf];

// hl==1->max deque
// hl==0->min deque

inline void refbuf()
{
     int rsp=fread(buf,1,maxbuf,fin);  
     if(rsp<maxbuf) buf[rsp]=0;
     ind2=0;
}

inline si readnr()
{
	 si rsp=0;
	 
	 one:
         while(ind2<maxbuf && !isdigit(buf[ind2])) ++ind2;
         if(ind2 == maxbuf)
         {
           refbuf();
           goto one;
         }  
    two:
         while(ind2<maxbuf && isdigit(buf[ind2]))
         {
           rsp=rsp*10+buf[ind2]-'0';
           ++ind2;
         }     
         if(ind2 == maxbuf)
         {
           refbuf();
           goto two;
         }
         
     return rsp;      
}

inline void ins1(si wh[],si wi[],si &st,si &dr,si ind,si elem)
{
	while(elem>wh[dr]&&dr>=st) dr--;
	dr++;
	wh[dr]=elem;
	wi[dr]=ind;

}

inline void ins0(si wh[],si wi[],si &st,si &dr,si ind,si elem)
{
	while(elem<wh[dr]&&dr>=st) dr--;
	dr++;
	wh[dr]=elem;
	wi[dr]=ind;

}
void solve(si lines,si columns)
{
	si j,i,frontl,fronth,backl,backh;
	for(j=1;j<=m;j++)
	{
		stl[j]=1;
		drl[j]=0;
		sth[j]=1;
		drh[j]=0;
		for(i=1;i<lines;i++)
		{
			ins0(deql[j],indl[j],stl[j],drl[j],i,a[i][j]);
			ins1(deqh[j],indh[j],sth[j],drh[j],i,a[i][j]);
		}
	}
	for(i=lines;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			ins0(deql[j],indl[j],stl[j],drl[j],i,a[i][j]);
			ins1(deqh[j],indh[j],sth[j],drh[j],i,a[i][j]);
			if(indl[j][stl[j]]<=i-lines) stl[j]++;
			if(indh[j][sth[j]]<=i-lines) sth[j]++;
		}
		frontl=1;backl=0;
		fronth=1;backh=0;
		for(j=1;j<=m;j++)
		{
			ins0(dl,il,frontl,backl,j,deql[j][stl[j]]);
			ins1(dh,ih,fronth,backh,j,deqh[j][sth[j]]);
			if(il[frontl]<=j-columns) frontl++;
			if(ih[fronth]<=j-columns) fronth++;
			if(j>=columns) if(ans>dh[fronth]-dl[frontl])
			{
				ans=dh[fronth]-dl[frontl];
				nr=1;
			}
			else if(ans==dh[fronth]-dl[frontl]) nr++;
		}
	}
}
int main()
{
    int beg=clock();
    
	si i,j,dx,dy;
	
	refbuf();
	
	n=readnr();
	m=readnr();
	p=readnr();
	
	for(i=1;i<=n;++i)
	  for(j=1;j<=m;++j)
		a[i][j]=readnr();
	
	
	for(i=1;i<=p;i++)
	{
		dx=readnr();
		dy=readnr();
		
		ans=inf;
		nr=0;
		if(dx<=n&&dy<=m) solve(dx,dy);
		if(dx!=dy) if(dy<=n&&dx<=m) solve(dy,dx);
		fprintf(fout,"%d %d\n",ans,nr);
	}
	
	int end=clock();
	
	//fprintf(fout,"%lf",(double)(end-beg)/CLOCKS_PER_SEC);
	
	fclose(fin);
	fclose(fout);
	
	return 0;
}