Pagini recente » Cod sursa (job #907329) | Cod sursa (job #137932) | Cod sursa (job #1345930) | Cod sursa (job #395123) | Cod sursa (job #2331526)
#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";
}
}
}