Cod sursa(job #494997)

Utilizator ChallengeMurtaza Alexandru Challenge Data 23 octombrie 2010 17:01:40
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <fstream>
#include <deque>

//#define DEBUG

using namespace std;

const char InFile[]="struti.in";
const char OutFile[]="struti.out";
const int MaxN=1005;
const int MAX=1<<30;

ifstream fin(InFile);
ofstream fout(OutFile);

struct s
{
	s(int x2=0,int pos2=0):x(x2),pos(pos2){}
	int x,pos;
};

int dmax_st,dmax_sf,dmin_st,dmin_sf,n,m,p,dx,dy,a[MaxN][MaxN],sol,nrsol,mat[MaxN][MaxN],matmin[MaxN][MaxN],matmax[MaxN][MaxN];
s dmax[MaxN],dmin[MaxN];

inline void add(int x, int pos)
{
	while(dmin_st<=dmin_sf)
	{
		if(dmin[dmin_sf].x<x)
		{
			break;
		}
		--dmin_sf;
	}
	dmin[++dmin_sf].x=x;
	dmin[dmin_sf].pos=pos;

	while(dmax_st<=dmax_sf)
	{
		if(dmax[dmax_sf].x>x)
		{
			break;
		}
		--dmax_sf;
	}
	dmax[++dmax_sf].x=x;
	dmax[dmax_sf].pos=pos;
}

inline void del(int pos)
{
	while(dmin_st<=dmin_sf)
	{
		if(dmin[dmin_st].pos>=pos)
		{
			break;
		}
		++dmin_st;
	}

	while(dmax_st<=dmax_sf)
	{
		if(dmax[dmax_st].pos>=pos)
		{
			break;
		}
		++dmax_st;
	}
}

inline void solve()
{
	for(register int i=1;i<=n;++i)
	{
		dmax_st=0;
		dmax_sf=-1;
		dmin_st=0;
		dmin_sf=-1;
		for(register int j=1;j<=m;++j)
		{
			add(a[i][j],j);
			if(j-dy+1>0)
			{
				del(j-dy+1);
				matmax[i][j-dy+1]=dmax[dmax_st].x;
				matmin[i][j-dy+1]=dmin[dmin_st].x;
			}
		}
	}

#ifdef DEBUG
	for(register int i=1;i<=n;++i)
	{
		for(register int j=1;j<=m-dy+1;++j)
		{
			fout<<matmax[i][j]<<" ";
		}
		fout<<"\n";
	}
	fout<<"\n";
	for(register int i=1;i<=n;++i)
	{
		for(register int j=1;j<=m-dy+1;++j)
		{
			fout<<matmin[i][j]<<" ";
		}
		fout<<"\n";
	}
	fout<<"\n";
#endif

	for(register int j=1;j<=m-dy+1;++j)
	{
		dmax_st=0;
		dmax_sf=-1;
		dmin_st=0;
		dmin_sf=-1;
		for(register int i=1;i<=n;++i)
		{
			add(matmin[i][j],i);
			add(matmax[i][j],i);
			if(i-dx+1>0)
			{
				del(i-dx+1);
				mat[i-dx+1][j]=dmax[dmax_st].x-dmin[dmin_st].x;
			}
		}
	}

#ifdef DEBUG
	for(register int i=1;i<=n-dx+1;++i)
	{
		for(register int j=1;j<=m-dy+1;++j)
		{
			fout<<mat[i][j]<<" ";
		}
		fout<<"\n";
	}
	fout<<"\n\n\n";
#endif

	for(register int i=1;i<=n-dx+1;++i)
	{
		for(register int j=1;j<=m-dy+1;++j)
		{
			if(sol>mat[i][j])
			{
				sol=mat[i][j];
				nrsol=1;
			}
			else if(sol==mat[i][j])
			{
				++nrsol;
			}
		}
	}
}

int main()
{
	fin>>n>>m>>p;
	for(register int i=1;i<=n;++i)
	{
		for(register int j=1;j<=m;++j)
		{
			fin>>a[i][j];
		}
	}
	for(register int i=0;i<p;++i)
	{
		fin>>dx>>dy;
		sol=MAX;
		nrsol=0;
		solve();
		if(dx!=dy)
		{
			swap(dx,dy);
			solve();
		}
		fout<<sol<<" "<<nrsol<<"\n";
	}
	fout.close();
	fin.close();
	return 0;
}