Pagini recente » Cod sursa (job #92710) | Cod sursa (job #3031322) | Cod sursa (job #2663660) | Cod sursa (job #3278010) | Cod sursa (job #367393)
Cod sursa(job #367393)
#include<stdio.h>
#define NMAX 1001
using namespace std;
typedef struct { int dif, nr; } pereche;
typedef struct { int val, poz; } dequeue_node;
dequeue_node Q[NMAX];
int N,M,P;
short int A[NMAX][NMAX], B[NMAX][NMAX], C[NMAX][NMAX];
void deq(int a, int b, int semn)
{
int i, j, inceput, sfarsit;
// fac dequeue pe coloane
for (j = 1; j <= N; j++)
{
inceput = 1; sfarsit = 0;
for (i = 1; i <= M; i++)
{
while (sfarsit >= inceput && A[i][j] * semn < Q[sfarsit].val * semn)
sfarsit--;
if (inceput <= sfarsit && Q[inceput].poz <= i-a)
inceput++;
sfarsit++; Q[sfarsit].val = A[i][j]; Q[sfarsit].poz = i;
if (i >= a)
B[i-a+1][j] = Q[inceput].val;
}
}
// fac dequeue pe linii cu rezultatele de pe coloane
for (i = 1; i <= M-a+1; i++)
{
inceput = 1; sfarsit = 0; // initializare dequeue
for (j = 1; j <= N; j++)
{
while(sfarsit >= inceput && B[i][j] * semn < Q[sfarsit].val *semn)
sfarsit--;
if(inceput <= sfarsit && Q[inceput].poz <= j-b)
inceput++;
sfarsit++;
Q[sfarsit].poz = j;
Q[sfarsit].val = B[i][j];
if(j >= b)
{
if (semn == +1)
C[i][j-b+1] = Q[inceput].val;
else if (semn == -1)
C[i][j-b+1] = Q[inceput].val - C[i][j-b+1];
}
}
}
}
pereche solve(int a, int b)
{ int i, j;
// minim
deq(a, b, +1);
// maxim
deq(a, b, -1);
pereche r;
r.dif = 30000; r.nr = 0;
for (i = 1; i <= M-a+1; i++)
for (j = 1; j <= N-b+1; j++)
if (C[i][j] < r.dif)
{
r.dif = C[i][j];
if (C[i][j] == 0)
printf("? %d %d\n", i, j);
r.nr = 1;
}
else if (C[i][j] == r.dif)
r.nr++;
return r;
}
int main()
{ int i, j, a, b;
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", &a, &b);
pereche r = solve(a, b);
if (a != b)
{
pereche r1 = solve(b, a);
if (r1.dif < r.dif)
r = r1;
else if (r1.dif == r.dif)
r.nr += r1.nr;
}
printf("%d %d\n", r.dif, r.nr);
}
return 0;
}