Cod sursa(job #424266)

Utilizator bog29Antohi Bogdan bog29 Data 24 martie 2010 18:36:28
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<fstream>
#define dmax 1004
using namespace std;
ifstream in("struti.in");
ofstream out("struti.out");

int n,m,t,mat[dmax][dmax],sol1[dmax][dmax],a,b,dq1[dmax],dq2[dmax],sol2[dmax][dmax],mn=-1,nrm;

void solve(int a,int b)
{	int i,p1=1,p2=0,p11=1,p22=0,j;
	for(i=1;i<=n;i++)
	{	p1=1; p2=0; p11=1; p22=0;
		for(j=1;j<=m;j++)
		{	while( mat[i][dq1[p2]] < mat[i][j] && p2>=p1)
				p2--;
			p2++;
			dq1[p2]=j;
			if( j - dq1[p1] > b-1)
				p1++;
			sol1[i][j]=mat[i][dq1[p1]];
			
			while( mat[i][dq2[p22]] > mat[i][j] && p22>=p11)
				p22--;
			p22++;
			dq2[p22]=j;
			if( j - dq2[p11] > b-1)
				p11++;
			sol2[i][j]=mat[i][dq2[p11]];
		}		
	}
	
	for(j=1;j<=m;j++)
	{	p1=1; p2=0; p11=1; p22=0;
		for(i=1;i<=n;i++)
		{	while(sol1[dq1[p2]][j] < sol1[i][j] && p2>=p1)
				p2--;
			p2++;
			dq1[p2]=i;
			if(i - dq1[p1] > a-1)
				p1++;
			
			while(sol2[dq2[p22]][j] > sol2[i][j] && p22>=p11)
				p22--;
			p22++;
			dq2[p22]=i;
			if(i - dq2[p11] > a-1)
				p11++;
			
			if(i >= a && j >= b)
			{	if(sol1[dq1[p1]][j] - sol2[dq2[p11]][j] < mn || mn==-1)
				{	mn=sol1[dq1[p1]][j] - sol2[dq2[p11]][j];
					nrm=1;
				}
				else if(sol1[dq1[p1]][j] - sol2[dq2[p11]][j] == mn )
					nrm++;
			}
		}
	}
}

int main()
{	int i,j;
	in>>n>>m>>t;
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			in>>mat[i][j];
	for(;t;t--)
	{	in>>a>>b;
		mn=-1;
		nrm=0;
		solve(a,b);
		if(a!=b)
			solve(b,a);
		out<<mn<<" "<<nrm<<'\n';
	}	
	in.close();
	out.close();
	return 0;
}