Cod sursa(job #341298)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 17 august 2009 23:25:42
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<cstdio>
#define N 1001
int a[N][N],u[N],p[N],d[N][N],u1[N],p1[N],d1[N][N],maxim,minim,num,rez,n,m;
void deque(int x,int dx,int dy)
{
	maxim=minim=0;
	for (int j=1; j<=dy; ++j)
	{
		for (int i=x; i<=x+dx; ++i)
		{
			while (u[i]!=p[i]&&a[i][j]<=a[i][d[i][u[i]-1]])
				--u[i];
			d[i][u[i]++]=j;
			if (minim>a[i][d[i][p[i]]])
				minim=a[i][d[i][p[i]]];
			while (u1[i]!=p1[i]&&a[i][j]>=a[i][d1[i][u1[i]-1]])
				--u1[i];
			d1[i][u1[i]++]=j;
			if (maxim<a[i][d1[i][p1[i]]])
				maxim=a[i][d1[i][p1[i]]];
		}
	}
	rez=maxim-minim;
	for (int j=dy+1; j<=m; ++j)
	{
		for (int i=x; i<=x+dx; ++i)
		{
			int g=j-d[i][p[i]];
			if (g==dy)
			{				
				++p[i];
				minim=0;
			}
			while (u[i]!=p[i]&&a[i][j]<=a[i][d[i][u[i]-1]])
				--u[i];
			d[i][u[i]++]=j;
			if (minim>a[i][d[i][p[i]]])
				minim=a[i][d[i][p[i]]];
			g=j-d1[i][p1[i]];
			if (g==dy) 
			{
				++p1[i];
				maxim=0;
			}
			while (u1[i]!=p1[i]&&a[i][j]<=a[i][d1[i][u1[i]-1]])
				--u1[i];
			d1[i][u1[i]++]=j;
			if (maxim<a[i][d1[i][p1[i]]])
				maxim=a[i][d1[i][p1[i]]];
			if (rez>maxim-minim)
			{
				rez=maxim-minim; 
				num=1;
			}
			else
				if (rez==maxim-minim)
					++num;
		}
	}
}
void citire()
{
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	int l;
	scanf("%d%d%d",&n,&m,&l);
	for (int i=1; i<=n;++i)
		for (int j=1; j<=m; ++j)
			scanf("%d",&a[i][j]);
	while (l)
	{
		--l;
		int dx,dy;
		num=1;
		scanf("%d%d",&dx,&dy);
		for (int i=1; i<=n-dx; ++i)
			deque(i,dx,dy);
		for (int i=1; i<=n-dy; ++i)
			deque(i,dy,dx);
		printf("%d %d\n",rez,num);
	}
}
int main()
{
	citire();
	return 0;
}