Cod sursa(job #494992)

Utilizator ChallengeMurtaza Alexandru Challenge Data 23 octombrie 2010 16:49:59
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 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 n,m,p,dx,dy,a[MaxN][MaxN],sol,nrsol,mat[MaxN][MaxN],matmin[MaxN][MaxN],matmax[MaxN][MaxN];
deque<s> dmax,dmin;

inline void add(int x, int pos)
{
	while(!dmin.empty())
	{
		if(dmin.back().x<x)
		{
			break;
		}
		dmin.pop_back();
	}
	dmin.push_back(s(x,pos));

	while(!dmax.empty())
	{
		if(dmax.back().x>x)
		{
			break;
		}
		dmax.pop_back();
	}
	dmax.push_back(s(x,pos));
}

inline void del(int pos)
{
	while(!dmin.empty())
	{
		if(dmin.front().pos>=pos)
		{
			break;
		}
		dmin.pop_front();
	}

	while(!dmax.empty())
	{
		if(dmax.front().pos>=pos)
		{
			break;
		}
		dmax.pop_front();
	}
}

inline void solve()
{
	for(register int i=1;i<=n;++i)
	{
		dmax.clear();
		dmin.clear();
		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.front().x;
				matmin[i][j-dy+1]=dmin.front().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.clear();
		dmin.clear();
		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.front().x-dmin.front().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;
}