Pagini recente » Cod sursa (job #1131068) | Cod sursa (job #2811338) | Cod sursa (job #2049122) | Cod sursa (job #2175108) | Cod sursa (job #2331473)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
short n,m,i,j,nr,dx,dy,q,z,rez;
short v[1005][1005],mx[1005][1005],mn[1005][1005];
struct per
{ short h,p; } a,b;
deque<per> l,k;
per do_dx_dy(short dx,short dy)
{
short rz=10000,nr=0;
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];
while(!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;
while(!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];
while(!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];
while(!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,nr};
}
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);
fout<<a.h<<" "<<a.p<<"\n";
}
else
{
a=do_dx_dy(dx,dy);
b=do_dx_dy(dy,dx);
if(a.h<b.h)
fout<<a.h<<" "<<a.p<<"\n";
if(a.h>b.h)
fout<<b.h<<" "<<b.p<<"\n";
if(a.h==b.h)
fout<<a.h<<" "<<a.p+b.p<<"\n";
}
}
}