Cod sursa(job #2600888)

Utilizator alex_benescuAlex Ben alex_benescu Data 13 aprilie 2020 13:53:22
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 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,l1,l2,k1,k2,i,j,z,nr;
int v[1005][1005],mx[1005][1005],mn[1005][1005];
struct per
{	int h,p;	} l[1005],k[1005];
int do_dx_dy(int dx,int dy)
{
	nr=0;
	short i,j,rz=10000;
	for(j=1;j<=m;j++)
	{
		l1=k1=1;
		l2=k2=0;
		for(i=1;i<=n;i++)
		{
			z=v[i][j];
			if(l[l1].p==i-dx)	l1++;
			while(l2>=l1 && l[l2].h<=z)	l2--;
			l[++l2]={z,i};
			mx[i][j]=l[l1].h;

			if(k[k1].p==i-dx)	k1++;
			while(k2>=k1 && k[k2].h>=z)	k2--;
			k[++k2]={z,i};
			mn[i][j]=k[k1].h;
		}
	}
	for(i=dx;i<=n;i++)
	{
		l1=k1=1;
		l2=k2=0;
		for(j=1;j<=m;j++)
		{
			z=mx[i][j];
			if(l[l1].p==j-dy)	l1++;
			while(l2>=l1 && l[l2].h<=z)	l2--;
			l[++l2]={z,j};

			z=mn[i][j];
			if(k[k1].p==j-dy)	k1++;
			while(k2>=k1 && k[k2].h>=z)	k2--;
			k[++k2]={z,j};

			if(j>=dy)
			{
				z=l[l1].h-k[k1].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";
		}
	}
	return 0;
}