Cod sursa(job #426521)

Utilizator s_holmesSherlock Holmes s_holmes Data 27 martie 2010 10:01:24
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define schimb(a, b, c) ((a > b && c == 1) || (a < b && c == -1))
#define vfstv(a, b, c) ((a <= b && c == 1) || (a >= b && c == -1))
using namespace std;
const int INF = 1000000000;
const int NMAX = 1001;
const int MMAX = 1001;
typedef struct {int l, c;}coord;
coord st[NMAX][MMAX];
coord D[NMAX];
int A[NMAX][MMAX];
int N, M, P;
int NR = 0;
int f[MMAX];
int b[MMAX];

void initializari()
{
	for(int i = 1 ; i <= N ; i++)
	{
		D[i].l = 0, D[i].c = 0;
		for(int j = 1 ; j <= M ; j++)
			st[i][j].l = 0, st[i][j].c = 0;
		f[i] = 1;
		b[i] = 0;
	}
}

int linii(int x, int semn)
{
	int val = -(semn * INF);
	coord D[NMAX] = {0};
	int fD = 1, bD = 0;
	
	for(int i = 1 ; i <= N ; i++)
	{
		while(fD <= bD && vfstv(A[D[bD].l][D[bD].c], A[st[i][f[i]].l][st[i][f[i]].c], semn))
				bD--;
			D[++bD].l = st[i][f[i]].l;
			D[bD].c = st[i][f[i]].c;
			if(fD < i - x + 1)
				fD++;
		if(schimb(A[D[fD].l][D[fD].c], val, semn))
			val = A[D[fD].l][D[fD].c];
	}
	
	return val;	
}

int deque(int x, int y, int semn)
{
	int val = -(semn * INF);
	initializari();
	for(int j = 1 ; j <= M ; j++)
	{
		for(int i = 1 ; i <= N ; i++)
		{
			while(f[i] <= b[i] && vfstv(A[st[i][b[i]].l][st[i][b[i]].c], A[i][j], semn))
				b[i]--;
			st[i][++b[i]].l = i;
			st[i][b[i]].c = j;
			if(f[i] < i - y + 1)
				f[i]++;
		}
		
		if(j >= y)
		{
			int fct = linii(x, semn);
			if(schimb(fct, val, semn))
			{
				val = fct;
				NR = 0;
			}
			else if(fct == val)
				NR++;
		}
			
	}
	
	return val;
}

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)
			printf("%d %d\n",deque(x, y, 1) - deque(x, y, -1), NR);
		else
		{
			int p = deque(x, y, 1) - deque(x, y, -1), NR2 = NR;
			int q = deque(y, x, 1) - deque(y, x, -1);
			if(p > q)
				printf("%d %d\n", p, NR2);
			else
				printf("%d %d\n", q, NR);
		}
	}
	
	return 0;
}