Cod sursa(job #251885)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 3 februarie 2009 15:53:36
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include<stdio.h>
#include<ctype.h>
#include<string.h>
FILE*fin=fopen("struti.in","r");
FILE*fout=fopen("struti.out","w");
#define nm 1002
#define inf 10000
#define si short int
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;
char buf[6000];
// hl==1->max deque
// hl==0->min deque
inline int readn()
{
	int ans=0;
	while (isdigit(buf[ind]))
	{
		ans=ans*10+buf[ind]-'0';
		++ind;
	}
	++ind;
	return ans;
}

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()
{
	si i,j,dx,dy;
	fscanf(fin,"%hd%hd%hd\n",&n,&m,&p);
	for(i=1;i<=n;i++)
	{
		fgets(buf,6000,fin);
		ind=0;
		for(j=1;j<=m;j++)
		{
			a[i][j]=readn();
		}
	}
	for(i=1;i<=p;i++)
	{
		fscanf(fin,"%hd%hd",&dx,&dy);
		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);
	}
	fclose(fin);
	fclose(fout);
	return 0;
}