Pagini recente » Cod sursa (job #530148) | Cod sursa (job #503020) | Cod sursa (job #342811) | Cod sursa (job #2059506) | Cod sursa (job #1694182)
#include <iostream>
#include<fstream>
using namespace std;
int a[1005][1005],mn[1005][1005],mx[1005][1005],q,p1,p2,u1,u2,n,m,d[1005],dmx[1005],x,y,minim,nr;
int main()
{
ifstream f("struti.in");
ofstream g("struti.out");
f>>n>>m>>q;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
f>>a[i][j];
}
for(int contor=1;contor<=q;contor++)
{
nr=0;minim=8005;
f>>x>>y;
for(int k=1;k<=2;k++)
{
for(int i=1;i<=n;i++)
{
p1=1;u1=0;
p2=1;u2=0;
for(int j=1;j<=m;j++)
{
if(j-d[p1]>=y) p1++;
while(p1<=u1&&a[i][j]<a[i][d[u1]])
u1--;
u1++;
d[u1]=j;
if(j-dmx[p2]>=y) p2++;
while(p2<=u2&&a[i][j]>a[i][dmx[u2]])
u2--;
u2++;
dmx[u2]=j;
mn[i][j]=a[i][d[p1]];
mx[i][j]=a[i][dmx[p2]];
}
}
for(int j=y;j<=m;j++)
{
p1=1;u1=0;
p2=1;u2=0;
for(int i=1;i<=n;i++)
{
if(i-d[p1]>=x) p1++;
while(p1<=u1&&mn[i][j]<mn[d[u1]][j])
u1--;
u1++;
d[u1]=i;
if(i-dmx[p2]>=x) p2++;
while(p2<=u2&&mx[i][j]>mx[dmx[u2]][j])
u2--;
u2++;
dmx[u2]=i;
if(i>=x)
{
if(mx[dmx[p2]][j]-mn[d[p1]][j]<minim)
{
minim=mx[dmx[p2]][j]-mn[d[p1]][j];
nr=1;
}
else
if(mx[dmx[p2]][j]-mn[d[p1]][j]==minim)
{
nr++;
}
}
}
}
if(x!=y)swap(x,y);
else k=2;
}
g<<minim<<' '<<nr<<'\n';
}
return 0;
}