Cod sursa(job #2331526)

Utilizator shantih1Alex S Hill shantih1 Data 29 ianuarie 2019 17:52:19
Problema Struti Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <queue>

using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");

int rez,n,m,dx,dy,q,na,nb,a,b;
short i,j,z,nr;
short v[1005][1005],mx[1005][1005],mn[1005][1005];
struct per
{	short h,p;	};
deque<per> l,k;

int do_dx_dy(int dx,int dy)
{
	nr=0;
	short i,j,rz=10000;
	for(j=1;j<=m;j++)
	{
		while(!l.empty())	l.pop_back();
		while(!k.empty())	k.pop_back();
		for(i=1;i<=n;i++)
		{
			z=v[i][j];
			if(!l.empty() && l.front().p<=i-dx)	l.pop_front();
			while(!l.empty() && l.back().h<=z)
				l.pop_back();
			l.push_back({z,i});
			mx[i][j]=l.front().h;
			
			if(!k.empty() && k.front().p<=i-dx)	k.pop_front();
			while(!k.empty() && k.back().h>=z)
				k.pop_back();
			k.push_back({z,i});
			mn[i][j]=k.front().h;
		}
	}
	for(i=dx;i<=n;i++)
	{
		while(!l.empty())	l.pop_back();
		while(!k.empty())	k.pop_back();
		for(j=1;j<=m;j++)
		{
			z=mx[i][j];
			if(!l.empty() && l.front().p<=j-dy)	l.pop_front();
			while(!l.empty() && l.back().h<=z)
				l.pop_back();
			l.push_back({z,j});
			
			z=mn[i][j];
			if(!k.empty() && k.front().p<=j-dy)	k.pop_front();
			while(!k.empty() && k.back().h>=z)
				k.pop_back();
			k.push_back({z,j});
			
			if(j>=dy)
			{
				z=l.front().h-k.front().h;
				if(z<rz)
					rz=z, nr=0;
				if(z==rz)	nr++;
			}
		}
	}
	return rz;
}

int main() {
	
	fin>>n>>m>>q;
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			fin>>v[i][j];
	while(q--)
	{
		fin>>dx>>dy;
		if(dx==dy)
		{
			a=do_dx_dy(dx,dy);
			na=nr;
			fout<<a<<" "<<na<<"\n";
		}
		else
		{
			a=do_dx_dy(dx,dy);
			na=nr;
			b=do_dx_dy(dy,dx);
			nb=nr;
			if(a<b)
				fout<<a<<" "<<na<<"\n";
			if(a>b)
				fout<<b<<" "<<nb<<"\n";
			if(a==b)
				fout<<a<<" "<<na+nb<<"\n";
		}
	}
}