Cod sursa(job #384868)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 21 ianuarie 2010 16:38:55
Problema Struti Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 2.1 kb
#include<stdio.h>
#define infile "struti.in"
#define outfile "struti.out"
#define nmax 1001
#define inf ~(1<<31)
short int h[nmax][nmax]; //harta
short int min[nmax][nmax];
short int max[nmax][nmax];
int m,n; //numarul de linii, respectiv coloane
int q; //numarul de query-uri
int a,b; //valoarea minima, respectiv numarul de dreptunghiuri

void read()
{
	int i,j;
	scanf("%d %d %d\n",&m,&n,&q);
	for(i=1;i<=m;i++)
		for(j=1;j<=n;j++)
			scanf("%d",&h[i][j]);
}

void deqmin(short int v[], short int min[], int n, int dist)
{
	short int deqp[n+1];
	short int deqv[n+1];
	int st,dr,i;
	
	for(i=1,st=1,dr=0;i<=n;i++)
	{
		while(st<=dr && deqv[dr]>=v[i]) dr--;
		++dr; deqp[dr]=i; deqv[dr]=v[i];
		if(i-deqp[st]+1>dist) st++;
		if(i>=dist) min[i]=deqv[st];
	}
}

void deqmax(int v[], int max[], int n, int dist)
{
	short int deqp[n+1];
	short int deqv[n+1];
	int st,dr,i;
	
	for(i=1,st=1,dr=0;i<=n;i++)
	{
		while(st<=dr && deqv[dr]<=v[i]) dr--;
		++dr; deqp[dr]=i; deqv[dr]=v[i];
		if(i-deqp[st]+1>dist) st++;
		if(i>=dist) max[i]=deqv[st];
	}
}

void count(int dx, int dy)
{
	short int vmin[nmax];
	short int vmax[nmax];
	short int v[nmax];
	int i,j;
	
	//facem deq pe fiecare coloana
	for(i=1;i<=n;i++)
	{
		//construim vectorul pentru aceasta coloana
		for(j=1;j<=m;j++) v[j]=h[j][i];
		
		//facem deq-ul pentru min si pentru max
		deqmin(v,vmin,m,dx);
		deqmax(v,vmax,m,dx);
		
		//salvam valorile in matrici
		for(j=1;j<=m;j++)
		{
			min[j][i]=vmin[j];
			max[j][i]=vmax[j];
		}
	}
	
	//facem deq pe fiecare linie
	for(i=1;i<=m;i++)
	{
		//facem deq-ul pentru min si max
		deqmin(min[i],min[i],n,dy);
		deqmax(max[i],max[i],n,dy);
	}
	
	//acum verificam toate dreptunghiurile
	for(i=dx;i<=m;i++)
		for(j=dy;j<=n;j++)
			if(max[i][j]-min[i][j]<a) a=max[i][j]-min[i][j],b=1;
			else if(max[i][j]-min[i][j]==a) b++;
}

void solve()
{
	int dx,dy;
	
	while(q--)
	{
		a=inf,b=0;
		scanf("%d %d\n",&dx,&dy);
		if(dx==dy) count(dx,dy);
		else
		{
			count(dx,dy);
			count(dy,dx);
		}
		printf("%d %d\n",a,b);
	}
}

int main()
{
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	read();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}