Pagini recente » Cod sursa (job #288782) | Cod sursa (job #3291077) | Cod sursa (job #1235373) | Cod sursa (job #2153810) | Cod sursa (job #371622)
Cod sursa(job #371622)
#include<stdio.h>
#define NMAX 1001
using namespace std;
typedef struct {int dif,num;} pereche;
typedef struct {int val,poz;} dequeue;
dequeue q[NMAX];
int n,m,p;
short int a[NMAX][NMAX],b[NMAX][NMAX],c[NMAX][NMAX];
void deq(int x, int y, int sign)
{
int i,j,in,sf;
for (j=1;j<=n;j++)
{
in=1;
sf=0;
for(i=1;i<=m;i++)
{
while(sf>=in&&a[i][j]*sign<q[sf].val*sign)
sf--;
if (in<=sf&&q[in].poz <= i-x)
in++;
sf++;
q[sf].val=a[i][j];
q[sf].poz=i;
if (i>=x)
b[i-x+1][j]=q[in].val;
}
}
for (i=1;i<=m-x+1;i++)
{
in=1;
sf=0;
for (j=1;j<=n;j++)
{
while(sf>=in&&b[i][j]*sign<q[sf].val*sign)
sf--;
if(in<=sf&&q[in].poz<=j-y)
in++;
sf++;
q[sf].poz=j;
q[sf].val=b[i][j];
if(j>=y)
{
if (sign==+1)
c[i][j-y+1]=q[in].val;
else if (sign==-1)
c[i][j-y+1]=q[in].val-c[i][j-y+1];
}
}
}
}
pereche solve(int x, int y)
{ int i, j;
deq(x,y,+1);
deq(x,y,-1);
pereche rez;
rez.dif=30000;
rez.num=0;
for(i=1;i<=m-x+1; i++)
for(j=1;j<=n-y+1;j++)
if(c[i][j]<rez.dif)
{
rez.dif=c[i][j];
if (c[i][j]==0)
printf("? %d %d\n", i, j);
rez.num=1;
}
else if (c[i][j]==rez.dif)
rez.num++;
return rez;
}
int main()
{ int i,j,x,y;
freopen("struti.in", "r", stdin);
freopen("struti.out", "w", stdout);
scanf("%d %d %d",&m,&n,&p);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(i=1;i<=p;i++)
{
scanf("%d %d",&x,&y);
pereche rez=solve(x,y);
if (x!=y)
{
pereche rez1 = solve(y,x);
if (rez1.dif<rez.dif)
rez=rez1;
else if (rez1.dif==rez.dif)
rez.num+=rez1.num;
}
printf("%d %d\n", rez.dif, rez.num);
}
return 0;
}