Pagini recente » Cod sursa (job #1245843) | Cod sursa (job #2584440) | Cod sursa (job #1587360) | Cod sursa (job #1844828) | Cod sursa (job #2079014)
#include <cstdio>
#include <deque>
using namespace std;
struct aa
{
int c;
int v;
};
int a[1002][1002],mic[1002][1002],mare[1002][1002],n,m;
void solve(int k1,int k2)
{
deque <aa> mn[1002],mx[1002];
int i,j,req1=2000000000,nr1,m2;
aa x,mini,maxi;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
x.v=a[i][j];
x.c=j;
while(!mn[i].empty()&&mn[i].back().v>=x.v)
mn[i].pop_back();
mn[i].push_back(x);
while(!mx[i].empty()&&mx[i].back().v<=x.v)
mx[i].pop_back();
mx[i].push_back(x);
if(mn[i].front().c==j-k1)
mn[i].pop_front();
if(mx[i].front().c==j-k1)
mx[i].pop_front();
if(j>=k1)
{
mic[i][j-k1+1]=mn[i].front().v;
mare[i][j-k1+1]=mx[i].front().v;
}
}
mn[i].clear();
mx[i].clear();
}
m2=m-k1+1;
for(i=1; i<=m2; i++)
{
for(j=1; j<=n; j++)
{
mini.v=mic[j][i];
maxi.v=mare[j][i];
mini.c=j;
maxi.c=j;
while(!mn[i].empty()&&mn[i].back().v>=mini.v)
mn[i].pop_back();
mn[i].push_back(mini);
while(!mx[i].empty()&&mx[i].back().v<=maxi.v)
mx[i].pop_back();
mx[i].push_back(maxi);
if(mn[i].front().c==j-k2)
mn[i].pop_front();
if(mx[i].front().c==j-k2)
mx[i].pop_front();
if(j>=k2)
{
if(mx[i].front().v-mn[i].front().v<req1)
req1=mx[i].front().v-mn[i].front().v,nr1=1;
else if(mx[i].front().v-mn[i].front().v==req1)
nr1++;
}
}
mn[i].clear();
mx[i].clear();
}
if(k1!=k2)
{
i=k1;
k1=k2;
k2=i;
int req2=2000000000,nr2;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
x.v=a[i][j];
x.c=j;
while(!mn[i].empty()&&mn[i].back().v>=x.v)
mn[i].pop_back();
mn[i].push_back(x);
while(!mx[i].empty()&&mx[i].back().v<=x.v)
mx[i].pop_back();
mx[i].push_back(x);
if(mn[i].front().c==j-k1)
mn[i].pop_front();
if(mx[i].front().c==j-k1)
mx[i].pop_front();
if(j>=k1)
{
mic[i][j-k1+1]=mn[i].front().v;
mare[i][j-k1+1]=mx[i].front().v;
}
}
mn[i].clear();
mx[i].clear();
}
m2=m-k1+1;
for(i=1; i<=m2; i++)
{
for(j=1; j<=n; j++)
{
mini.v=mic[j][i];
maxi.v=mare[j][i];
mini.c=j;
maxi.c=j;
while(!mn[i].empty()&&mn[i].back().v>=mini.v)
mn[i].pop_back();
mn[i].push_back(mini);
while(!mx[i].empty()&&mx[i].back().v<=maxi.v)
mx[i].pop_back();
mx[i].push_back(maxi);
if(mn[i].front().c==j-k2)
mn[i].pop_front();
if(mx[i].front().c==j-k2)
mx[i].pop_front();
if(j>=k2)
{
if(mx[i].front().v-mn[i].front().v<req2)
req2=mx[i].front().v-mn[i].front().v,nr2=1;
else if(mx[i].front().v-mn[i].front().v==req2)
nr2++;
}
}
mn[i].clear();
mx[i].clear();
}
if(req2==req1)
printf("%d %d\n",req1,nr1+nr2);
if(req1>req2)
printf("%d %d\n",req2,nr2);
if(req2>req1)
printf("%d %d\n",req1,nr1);
}
else printf("%d %d\n",req1,nr1);
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int p,i,j,k1,k2;
scanf("%d%d%d",&n,&m,&p);
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
scanf("%d",&a[i][j]);
for(i=1; i<=p; i++)
{
scanf("%d%d",&k1,&k2);
solve(k1,k2);
}
return 0;
}