Pagini recente » Cod sursa (job #253753) | Cod sursa (job #1448262) | Cod sursa (job #1539606) | Cod sursa (job #1363802) | Cod sursa (job #2600888)
#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;
}