Cod sursa(job #371622)

Utilizator allynaAlina S allyna Data 5 decembrie 2009 23:24:32
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<stdio.h>
#define NMAX 1001
using namespace std;
typedef struct {int dif,num;} pereche;
typedef struct {int val,poz;} dequeue;
dequeue q[NMAX];
int n,m,p;
short int a[NMAX][NMAX],b[NMAX][NMAX],c[NMAX][NMAX];
void deq(int x, int y, int sign)
{
	int i,j,in,sf;
	for (j=1;j<=n;j++)
	{
		in=1;
		sf=0;
		for(i=1;i<=m;i++)
		{
			while(sf>=in&&a[i][j]*sign<q[sf].val*sign)
				sf--;
			if (in<=sf&&q[in].poz <= i-x)
				in++;
			sf++;
			q[sf].val=a[i][j];
			q[sf].poz=i;
			if (i>=x)
				b[i-x+1][j]=q[in].val;
		}
	}
	for (i=1;i<=m-x+1;i++)
	{
		in=1;
		sf=0;
		for (j=1;j<=n;j++)
		{
			while(sf>=in&&b[i][j]*sign<q[sf].val*sign)
				sf--;
			if(in<=sf&&q[in].poz<=j-y)
				in++;
			sf++;
			q[sf].poz=j;
			q[sf].val=b[i][j];
			if(j>=y)
			{
				if (sign==+1)
					c[i][j-y+1]=q[in].val;
				else if (sign==-1)
					c[i][j-y+1]=q[in].val-c[i][j-y+1];
			}
		}
	}
}
pereche solve(int x, int y)
{ int i, j;
	deq(x,y,+1);			
	deq(x,y,-1);
	pereche rez;
	rez.dif=30000;
	rez.num=0;
	for(i=1;i<=m-x+1; i++)
		for(j=1;j<=n-y+1;j++)
			if(c[i][j]<rez.dif)
			{
				rez.dif=c[i][j];
				if (c[i][j]==0)
					printf("? %d %d\n", i, j);
				rez.num=1;
			}
			else if (c[i][j]==rez.dif)
				rez.num++;
	return rez;
}

int main()
{ int i,j,x,y;
	freopen("struti.in", "r", stdin);
	freopen("struti.out", "w", stdout);
	scanf("%d %d %d",&m,&n,&p);
	for(i=1;i<=m;i++)
		for(j=1;j<=n;j++)
			scanf("%d",&a[i][j]);
	for(i=1;i<=p;i++)
	{
		scanf("%d %d",&x,&y);
		pereche rez=solve(x,y);
		if (x!=y)
		{
			pereche rez1 = solve(y,x);
			if (rez1.dif<rez.dif)
				rez=rez1;
			else if (rez1.dif==rez.dif)
				rez.num+=rez1.num;
		}
		
		printf("%d %d\n", rez.dif, rez.num);
	}
	return 0;
}