Pagini recente » Cod sursa (job #3221117) | Cod sursa (job #1490016) | Cod sursa (job #2369053) | Cod sursa (job #2850684) | Cod sursa (job #1074607)
#include <stdio.h>
#define Nmax 1001
#define INF 0x3f3f3f3f
using namespace std;
int N,P,M,a[Nmax][Nmax];
int cnt,min;
struct matr
{
int min,max;
}b[Nmax][Nmax];
void deque(int l,int c)
{
// printf("%d %d\n",l,c);
int i,j,dmin[Nmax],dmax[Nmax],x;
int st_min,st_max,fn_min,fn_max;
for(i=1;i<=M;++i)
{
st_min = 1;
fn_min = 0;
st_max = 1;
fn_max = 0;
for(j=1;j<=N;++j)
{
//maxim pe linie
x = a[i][j];
while(fn_max>=st_max && x >= a[i][ dmax[ fn_max ] ])
--fn_max;
dmax[++fn_max] = j;
if(dmax[st_max] == j-c)
++st_max;
if(j>=c)
b[i][j].max = a[i][ dmax[ st_max ] ];
//minim pe linie
x = a[i][j];
while(fn_min>=st_min && x <= a[i][ dmin[ fn_min ] ])
--fn_min;
dmin[++fn_min] = j;
if(dmin[st_min] == j-c)
++st_min;
if(j>=c)
b[i][j].min = a[i][ dmin[ st_min ] ];
}
}
for(j=c;j<=N;++j)
{
st_min = 1;
fn_min = 0;
st_max = 1;
fn_max = 0;
for(i=1;i<=M;++i)
{
//maxim
x = b[i][j].max;
while(fn_max>=st_max && x >= b[ dmax[ fn_max ] ][j].max)
--fn_max;
dmax[ ++fn_max ] = i;
if(dmax[ st_max ] == i-l)
++st_max;
//minim
x = b[i][j].min;
while(fn_min>=st_min && x <= b[ dmin[ fn_min] ][j].min)
--fn_min;
dmin[ ++fn_min ] = i;
if(dmin[ st_min ] == i-l)
++st_min;
if(i>=l)
{
int val = b[ dmax[st_max] ][j].max - b[ dmin[st_min] ][j].min;
if(val <= min)
{
if(val == min)
{
++cnt;
}
else
{
min = val;
cnt = 1;
}
}
}
}
}
}
int main()
{
FILE*f = fopen("struti.in","r");
fscanf(f,"%d %d %d", &M, &N, &P);
int i,j;
for(i=1;i<=M;++i)
for(j=1;j<=N;++j)
fscanf(f,"%d",&a[i][j]);
FILE*g = fopen("struti.out","w");
int x, y;
while(P--)
{
cnt = 0;
min = INF;
fscanf(f,"%d %d",&x,&y);
deque(x,y);
if(x!=y)
deque(y,x);
fprintf(g,"%d %d\n",min,cnt);
}
fclose(f);
fclose(g);
return 0;
}