Pagini recente » Cod sursa (job #754973) | Cod sursa (job #236961) | Cod sursa (job #1149248) | Cod sursa (job #2344449) | Cod sursa (job #2067415)
#include <cstdio>
#include <deque>
#define DIMBUFF 100000
using namespace std;
FILE * fin = fopen ("struti.in", "r");
FILE *fout = fopen ("struti.out", "w");
int n, m, p, i, j, v[1002][1002], lmin[1002][1002], lmax[1002][1002],k, t, dy, dx,aux,nr;
deque<int> dmin, dmax;
int cmin[1002][1002],cmax[1002][1002],sol,maxi;
char buff[DIMBUFF];
int pp;
int numar() {
int val = 0;
while (!(buff[pp] >= '0' && buff[pp] <= '9')) {
pp++;
if (pp == DIMBUFF) {
fread(buff, 1, DIMBUFF, fin);
pp=0;
}
}
while (buff[pp] >= '0' && buff[pp] <= '9') {
val = val*10 + buff[pp] - '0';
pp++;
if (pp == DIMBUFF) {
fread(buff, 1, DIMBUFF, fin);
pp=0;
}
}
return val;
}
int main ()
{
fread(buff, 1, DIMBUFF, fin);
n=numar();
m=numar();
p=numar();
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
v[i][j]=numar();
for(t=1;t<=2*p;t++)
{
if(t%2==1)
{
dx=numar();
dy=numar();
}
else
{
aux=dx;
dx=dy;
dy=aux;
if(dx==dy)
{
fprintf (fout,"%d %d\n",maxi,sol);
continue;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
while(nr>0&&v[i][j]<=v[i][dmin[nr-1]])
{
nr--;
dmin.pop_back();
}
nr++;
dmin.push_back(j);
if(dmin[0]<j-dy+1)
{
dmin.pop_front();
nr--;
}
if(j>=dy)
lmin[i][j]=v[i][dmin[0]];
while(k>0&&v[i][j]>=v[i][dmax[k-1]])
{
k--;
dmax.pop_back();
}
k++;
dmax.push_back(j);
if(dmax[0]<j-dy+1)
{
dmax.pop_front();
k--;
}
if(j>=dy)
lmax[i][j]=v[i][dmax[0]];
}
while(nr>0)
{
nr--;
dmin.pop_front();
}
while(k>0)
{
k--;
dmax.pop_front();
}
}
for(j=dy;j<=m;j++)
{
for(i=1;i<=n;i++)
{
while(nr>0&&lmin[i][j]<=lmin[dmin[nr-1]][j])
{
nr--;
dmin.pop_back();
}
nr++;
dmin.push_back(i);
if(dmin[0]<i-dx+1)
{
dmin.pop_front();
nr--;
}
if(i>=dx)
cmin[i][j]=lmin[dmin[0]][j];
while(k>0&&lmax[i][j]>=lmax[dmax[k-1]][j])
{
k--;
dmax.pop_back();
}
k++;
dmax.push_back(i);
if(dmax[0]<i-dx+1)
{
dmax.pop_front();
k--;
}
if(i>=dx)
cmax[i][j]=lmax[dmax[0]][j];
}
while(nr>0)
{
nr--;
dmin.pop_front();
}
while(k>0)
{
k--;
dmax.pop_front();
}
}
if(t%2==1)
maxi=10000;
for(i=dx;i<=n;i++)
{
for(j=dy;j<=m;j++)
{
if(maxi>cmax[i][j]-cmin[i][j])
{
maxi=cmax[i][j]-cmin[i][j];
sol=1;
}
else
if(maxi==cmax[i][j]-cmin[i][j])
sol++;
}
}
if(t%2==0)
fprintf (fout,"%d %d\n",maxi,sol);
}
return 0;
}