Pagini recente » Cod sursa (job #259560) | Cod sursa (job #2485139) | Cod sursa (job #1938052) | Cod sursa (job #402870) | Cod sursa (job #426800)
Cod sursa(job #426800)
#include <cstdio>
#include <cstring>
#include <algorithm>
const int INF = 1000000000;
const int NMAX = 1001;
const int MMAX = 1001;
typedef struct {int l, c;}coord;
coord stmin[NMAX][MMAX];
coord Dmin[NMAX];
int fmin[MMAX];
int bmin[MMAX];
coord stmax[NMAX][MMAX];
coord Dmax[NMAX];
int fmax[MMAX];
int bmax[MMAX];
int A[NMAX][MMAX];
int N, M, P;
int NR = 0;
void initializari()
{
for(int i = 1 ; i <= N ; i++)
{
Dmax[i].l = 0, Dmax[i].c = 0;
for(int j = 1 ; j <= M ; j++)
stmax[i][j].l = 0, stmax[i][j].c = 0;
fmax[i] = 1;
bmax[i] = 0;
}
for(int i = 1 ; i <= N ; i++)
{
Dmin[i].l = 0, Dmin[i].c = 0;
for(int j = 1 ; j <= M ; j++)
stmin[i][j].l = 0, stmin[i][j].c = 0;
fmin[i] = 1;
bmin[i] = 0;
}
}
int linii(int x)
{
int val = INF;
coord Dmax[NMAX] = {0};
int fDmax = 1, bDmax = 0;
coord Dmin[NMAX] = {0};
int fDmin = 1, bDmin = 0;
for(int i = 1 ; i <= N ; i++)
{
while(fDmax <= bDmax && A[Dmax[bDmax].l][Dmax[bDmax].c] <= A[stmax[i][fmax[i]].l][stmax[i][fmax[i]].c])
bDmax--;
Dmax[++bDmax].l = stmax[i][fmax[i]].l;
Dmax[bDmax].c = stmax[i][fmax[i]].c;
if(Dmax[fDmax].l < i - x + 1)
fDmax++;
while(fDmin <= bDmin && A[Dmin[bDmin].l][Dmin[bDmin].c] >= A[stmin[i][fmin[i]].l][stmin[i][fmin[i]].c])
bDmin--;
Dmin[++bDmin].l = stmin[i][fmin[i]].l;
Dmin[bDmin].c = stmin[i][fmin[i]].c;
if(Dmin[fDmin].l < i - x + 1)
fDmin++;
if(i >= x)
if(A[Dmax[fDmax].l][Dmax[fDmax].c] - A[Dmin[fDmin].l][Dmin[fDmin].c] < val)
val = A[Dmax[fDmax].l][Dmax[fDmax].c] - A[Dmin[fDmin].l][Dmin[fDmin].c];
}
return val;
}
int deque(int x, int y)
{
int val = INF;
initializari();
for(int j = 1 ; j <= M ; j++)
{
for(int i = 1 ; i <= N ; i++)
{
while(fmax[i] <= bmax[i] && A[stmax[i][bmax[i]].l][stmax[i][bmax[i]].c] <= A[i][j])
bmax[i]--;
stmax[i][++bmax[i]].l = i;
stmax[i][bmax[i]].c = j;
if(stmax[i][fmax[i]].c < i - y + 1)
fmax[i]++;
}
for(int i = 1 ; i <= N ; i++)
{
while(fmin[i] <= bmin[i] && A[stmin[i][bmin[i]].l][stmin[i][bmin[i]].c] >= A[i][j])
bmin[i]--;
stmin[i][++bmin[i]].l = i;
stmin[i][bmin[i]].c = j;
if(stmin[i][fmin[i]].c < i - y + 1)
fmin[i]++;
}
if(j >= y)
{
int fct = linii(x);
if(fct < val)
{
val = fct;
NR = 1;
}
else if(fct == val)
NR++;
}
}
return val;
}
int main()
{
int x, y;
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d%d%d",&N,&M,&P);
for(int i = 1 ; i <= N ; i ++)
for(int j = 1 ; j <= M ; j++)
scanf("%d",&A[i][j]);
for(int k = 1 ; k <= P ; k++)
{
scanf("%d%d",&x,&y);
if(x == y)
printf("%d %d\n",deque(x, y), NR);
else
{
int p = deque(x, y), NR2 = NR;
int q = deque(y, x);
if(p > q)
printf("%d %d\n", p, NR2);
else if( p < q)
printf("%d %d\n", q, NR);
else
printf("%d %d\n", p + q, NR + NR2);
}
}
return 0;
}