Cod sursa(job #427554)

Utilizator ooctavTuchila Octavian ooctav Data 27 martie 2010 23:52:19
Problema Struti Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.04 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define SIRMAX 70000
const int INF = 1500000000;
const int NMAX = 1011;
const int MMAX = 1011;
int st[NMAX][MMAX];
int fmin[MMAX];
int bmin[MMAX];
int ST[NMAX][MMAX];
int fmax[MMAX];
int bmax[MMAX];
int A[NMAX][MMAX];
int N, M, P;
int NR = 0;
int m[NMAX][MMAX];
int MX[NMAX][MMAX];
char c[SIRMAX];

void parsare()
{
	int x, j;
	for(int i = 1 ; i <= N ; i ++)
	{
		j = 0;
		x = 0;
		fgets(c,SIRMAX,stdin);
		for(int k = 0 ; c[k] && c[k] != '\n' && c[k] != EOF ; k++)
			if(c[k] == ' ')
			{
				A[i][++j] = x;
				x = 0;
			}
			else
				x = 10 * x + c[k] - '0';
		if(x)
			A[i][++j] = x;
				
	}
}

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


void initializari()
{
	for(int i = 1 ; i <= N ; i++)
	{
		for(int j = 1 ; j <= M ; j++)
		{
			ST[i][j] = 0;
			st[i][j] = 0;
		}
		fmax[i] = 1;
		bmax[i] = 0;
		fmin[i] = 1;
		bmin[i] = 0;
	}
}

int linii(int x, int y)
{
	NR = 0;
	int val = INF;
	int D[MMAX];
	int F, B;
	int d[MMAX];
	int f, b;
	
	for(int i = x ; i <= N ; i++)
	{
		memset(D + 1, 0, M);
		F = 1, B = 0;
		memset(d + 1, 0, M);
		f = 1, b = 0;
		
		for(int j = 1 ; j <= M ; j++)
		{			
			while(F <= B && MX[i][D[B]] <= MX[i][j])
					B--;
			D[++B] = j;
			if(D[F] <= j - y)
				F++;
			
			while(f <= b && m[i][d[b]] >= m[i][j])
					b--;
			d[++b] = j;
			while(d[f] <= j - y)
				f++;
				
			if(j >= y)
				if(MX[i][D[F]] - m[i][d[f]] < val)
				{
					val = MX[i][D[F]] - m[i][d[f]];
					NR = 1;
				}
				else if(MX[i][D[F]] - m[i][d[f]] == val)
					NR++;
					
		}
	}
	
	return val;	
}

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

			while(fmin[j] <= bmin[j] && A[st[bmin[j]][j]][j] >= A[i][j])
				bmin[j]--;
			st[++bmin[j]][j] = i;
			
			while(st[fmin[j]][j] <= i - x)
				fmin[j]++;
		}
		
		if(i >= x)
			for(int j = 1 ; j <= M ; j++)			
			{
				MX[i][j] = A[ST[fmax[j]][j]][j];
				m[i][j] = A[st[fmin[j]][j]][j];
			}
			
	}
}

int main()
{
	int x, y;
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	
	scanf("%d%d%d\n",&N,&M,&P);
	parsare();
		
	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);
			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;
}