Cod sursa(job #261697)

Utilizator znakeuJurba Andrei znakeu Data 18 februarie 2009 18:17:03
Problema Struti Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1024

int v[MAXN][MAXN];
int mM[MAXN][MAXN];
//int mm[MAXN][MAXN];
int T[MAXN][MAXN];
int D[MAXN];

int M,N,P,m=0,r=0;

void chestie(int X, int Y)
{
	int i,j,L=0,R=0,tt=0; m=-1; r=0;
	
	for (j=1; j<=M; ++j)
	{
		L=1; R=0;
		for (i=1; i<=N; ++i)
		{
			while (L <= R && v[i][j] >=  v[ D[R] ][j]) --R; 
			D[++R] = i;
			if (D[L] == i-X) ++L;	
			if (i >= X)	T[i][j]=v[ D[L] ][j];		
		}
	}
	
	for (i=X; i<=N; ++i)
	{
		L=1; R=0;
		for (j=1; j<=M; ++j)
		{
			while (L <= R && T[i][j] >=  T[i][ D[R] ]) --R; 
			D[++R] = j;
			if (D[L] == j-Y) ++L;	
			if (j >= Y)	mM[i-X+1][j-Y+1]=T[i][ D[L] ];		
		}		
	}
	
	for (j=1; j<=M; ++j)
	{
		L=1; R=0;
		for (i=1; i<=N; ++i)
		{
			while (L <= R && v[i][j] <=  v[ D[R] ][j]) --R; 
			D[++R] = i;
			if (D[L] == i-X) ++L;	
			if (i >= X)	T[i][j]=v[ D[L] ][j];		
		}
	}
	
	for (i=X; i<=N; ++i)
	{
		L=1; R=0;
		for (j=1; j<=M; ++j)
		{
			while (L <= R && T[i][j] <=  T[i][ D[R] ]) --R; 
			D[++R] = j;
			if (D[L] == j-Y) ++L;	
			if (j >= Y)//	mm[i-X+1][j-Y+1]=T[i][ D[L] ];		
			{
				tt=mM[i-X+1][j-Y+1] - T[i][ D[L] ];
				if (tt==m) r++;
				if (m==-1 || tt<m) { r=1; m=tt; }
			}
		}		
	}
}

void citire()
{
	int i,j,m2,r2,X,Y;
	
	scanf("%d%d%d",&M,&N,&P);
	
	for (i=1; i<=M; ++i)
		for (j=1; j<=N; ++j)
			scanf("%d",&v[i][j]);
	
	for (i=0; i<P; ++i)
	{
		scanf("%d%d",&X,&Y);
		
		chestie(X,Y); m2=m; r2=r;
		if (X!=Y)
		{
			chestie(Y,X);
			if (m2==m) r2+=r;
			if (m2>m) { m2=m; r2=r;}		
		}
		
		printf("%d %d\n",m2,r2);		
	}
	
	
}


int main()
{
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	
	citire();	
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}