Cod sursa(job #427111)

Utilizator ooctavTuchila Octavian ooctav Data 27 martie 2010 15:42:06
Problema Struti Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.33 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
const int INF = 1000000000;
const int NMAX = 1001;
const int MMAX = 1001;
typedef struct {int l, c;}coord;
coord stmin[NMAX][MMAX];
coord Dmin[NMAX];
int fmin[MMAX];
int bmin[MMAX];
coord stmax[NMAX][MMAX];
coord Dmax[NMAX];
int fmax[MMAX];
int bmax[MMAX];
int A[NMAX][MMAX];
int N, M, P;
int NR = 0;
int Mmin[NMAX][MMAX];
int Mmax[NMAX][MMAX];

void scrie()
{
	for(int i = 1 ; i <= N ; i++)
	{
		for(int j = 1 ; j <= M ; j++)
			printf("%d ",Mmin[i][j]);
		printf("\n");
	}
	printf("\n");
	for(int i = 1 ; i <= N ; i++)
	{
		for(int j = 1 ; j <= M ; j++)
			printf("%d ",Mmax[i][j]);
		printf("\n");
	}
	printf("\n");
}

void initializari()
{
	for(int i = 1 ; i <= N ; i++)
	{
		Dmax[i].l = 0, Dmax[i].c = 0;
		for(int j = 1 ; j <= M ; j++)
		{
			stmax[i][j].l = 0;
			stmax[i][j].c = 0;
		}
		fmax[i] = 1;
		bmax[i] = 0;
	}
	for(int i = 1 ; i <= N ; i++)
	{
		Dmin[i].l = 0, Dmin[i].c = 0;
		for(int j = 1 ; j <= M ; j++)
		{
			stmin[i][j].l = 0;
			stmin[i][j].c = 0;
		}
		fmin[i] = 1;
		bmin[i] = 0;
	}
}

int linii(int x, int y)
{
	NR = 0;
	int val = INF;
	
	for(int j = y ; j <= M ; j++)
	{
		int Dmax[NMAX] = {0};
		int fDmax = 1, bDmax = 0;
		int Dmin[NMAX] = {0};
		int fDmin = 1, bDmin = 0;
		
		for(int i = 1 ; i <= N ; i++)
		{			
			while(fDmax <= bDmax && Mmax[Dmax[bDmax]][j] <= Mmax[i][j])
					bDmax--;
			Dmax[++bDmax] = i;
			if(Dmax[fDmax] < i - x + 1)
				fDmax++;
			
			while(fDmin <= bDmin && Mmin[Dmin[bDmin]][j] >= Mmin[i][j])
					bDmin--;
			Dmin[++bDmin] = i;
			if(Dmin[fDmin] < i - x + 1)
				fDmin++;
				
			if(i >= x)
				if(Mmax[Dmax[fDmax]][j] - Mmin[Dmin[fDmin]][j] < val)
				{
					val = Mmax[Dmax[fDmax]][j] - Mmin[Dmin[fDmin]][j];
					NR = 1;
				}
				else if(Mmax[Dmax[fDmax]][j] - Mmin[Dmin[fDmin]][j] == val)
					NR++;
					
		}
	}
	
	return val;	
}

void deque(int x, int y)
{
	initializari();
	for(int j = 1 ; j <= M ; j++)
	{
		for(int i = 1 ; i <= N ; i++)
		{
			while(fmax[i] <= bmax[i] && A[stmax[i][bmax[i]].l][stmax[i][bmax[i]].c] <= A[i][j])
				bmax[i]--;
			stmax[i][++bmax[i]].l = i;
			stmax[i][bmax[i]].c = j;
			if(stmax[i][fmax[i]].c < j - y + 1)
				fmax[i]++;

			while(fmin[i] <= bmin[i] && A[stmin[i][bmin[i]].l][stmin[i][bmin[i]].c] >= A[i][j])
				bmin[i]--;
			stmin[i][++bmin[i]].l = i;
			stmin[i][bmin[i]].c = j;
			if(stmin[i][fmin[i]].c < j - y + 1)
				fmin[i]++;
		}
		
		if(j >= y)
			for(int i = 1 ; i <= N ; i++)			
			{
				Mmax[i][j] = A[stmax[i][fmax[i]].l][stmax[i][fmax[i]].c];
				Mmin[i][j] = A[stmin[i][fmin[i]].l][stmin[i][fmin[i]].c];
			}
			
	}
}

int main()
{
	int x, y;
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	
	scanf("%d%d%d",&N,&M,&P);
	for(int i = 1 ; i <= N ; i ++)
		for(int j = 1 ; j <= M ; j++)
			scanf("%d",&A[i][j]);
		
	for(int k = 1 ; k <= P ; k++)
	{
		scanf("%d%d",&x,&y);
		if(x == y)
		{
			deque(x, y);			
			printf("%d %d",linii(x, y), NR);
		}
		else
		{
			deque(x, y);
			//scrie();
			int p = linii(x, y), NR2 = NR;
			deque(y, x);
			//scrie();
			int q = linii(y, x);
			if(p < q)
				printf("%d %d\n", p, NR2);
			else if( p > q)
				printf("%d %d\n", q, NR);
			else
				printf("%d %d\n", p, NR + NR2);
		}
	}
	
	return 0;
}