Pagini recente » Cod sursa (job #931011) | Cod sursa (job #2511299) | Cod sursa (job #300477) | Cod sursa (job #1125177) | Cod sursa (job #1910408)
#include <iostream>
#include <fstream>
#define Nmax 1003
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int i,j,n,m,dx,dy,MIN,q,head,tail,t,aux,nr;
int dmax1[Nmax][Nmax],dmax2[Nmax][Nmax],dmin1[Nmax][Nmax],dmin2[Nmax][Nmax],dq[Nmax],a[Nmax][Nmax];
void read()
{
int i,j;
f>>n>>m>>q;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
f>>a[i][j];
}
void deque_Min1()
{
for(i=1;i<=n;i++)
{
dq[1]=1; head=tail=1; t=0;
for(j=2;j<=m;j++)
{
while(head<=tail&&a[i][j]<a[i][dq[tail]])tail--;
tail++; dq[tail]=j;
if(j-dq[head]==dy)head++;
if(j>=dy)dmin1[i][++t]=a[i][dq[head]];
}
}
}
void deque_Min2()
{
for(j=1;j<=m;j++)
{
dq[1]=1; head=tail=1; t=0;
for(i=2;i<=n;i++)
{
while(head<=tail&&dmin1[i][j]<dmin1[dq[tail]][j])tail--;
tail++; dq[tail]=i;
if(i-dq[head]==dx)head++;
if(i>=dx)dmin2[++t][j]=dmin1[dq[head]][j];
}
}
}
void deque_Max1()
{
for(i=1;i<=n;i++)
{
dq[1]=1; head=tail=1; t=0;
for(j=2;j<=m;j++)
{
while(head<=tail&&a[i][j]>a[i][dq[tail]])tail--;
tail++; dq[tail]=j;
if(j-dq[head]==dy)head++;
if(j>=dy)dmax1[i][++t]=a[i][dq[head]];
}
}
}
void deque_Max2()
{
for(j=1;j<=m;j++)
{
dq[1]=1; head=tail=1; t=0;
for(i=2;i<=n;i++)
{
while(head<=tail&&dmax1[i][j]>dmax1[dq[tail]][j])tail--;
tail++; dq[tail]=i;
if(i-dq[head]==dx)head++;
if(i>=dx)dmax2[++t][j]=dmax1[dq[head]][j];
}
}
}
void findsol()
{
for(i=1;i<=n-dx+1;i++)
for(j=1;j<=m-dy+1;j++)
if(dmax2[i][j]-dmin2[i][j]<MIN){MIN=dmax2[i][j]-dmin2[i][j];nr=1;} else
if(dmax2[i][j]-dmin2[i][j]==MIN)nr++;
}
void solve()
{
int i;
for(i=1;i<=q;i++)
{
f>>dx>>dy;
MIN=8005; nr=0;
deque_Min1();deque_Min2();
deque_Max1();deque_Max2();
findsol();
if(dx!=dy)
{
aux=dx; dx=dy; dy=aux;
deque_Min1();deque_Min2();
deque_Max1();deque_Max2();
findsol();
}
g<<MIN<<" "<<nr<<'\n';
}
}
int main()
{
read();
solve();
f.close();
g.close();
return 0;
}