Pagini recente » Cod sursa (job #825028) | Cod sursa (job #2219894) | Cod sursa (job #2385933) | Cod sursa (job #1106398) | Cod sursa (job #427474)
Cod sursa(job #427474)
#include <cstdio>
#include <cstring>
#include <algorithm>
const int INF = 1000000000;
const int NMAX = 1001;
const int MMAX = 1001;
typedef struct {int l, c;}coord;
int stmin[NMAX][MMAX];
int fmin[MMAX];
int bmin[MMAX];
int stmax[NMAX][MMAX];
int fmax[MMAX];
int bmax[MMAX];
int A[NMAX][MMAX];
int N, M, P;
int NR = 0;
int Mmin[NMAX][MMAX];
int Mmax[NMAX][MMAX];
void scrie()
{
for(int i = 1 ; i <= N ; i++)
{
for(int j = 1 ; j <= M ; j++)
printf("%d ",Mmin[i][j]);
printf("\n");
}
printf("\n");
for(int i = 1 ; i <= N ; i++)
{
for(int j = 1 ; j <= M ; j++)
printf("%d ",Mmax[i][j]);
printf("\n");
}
printf("\n");
}
void initializari()
{
for(int i = 1 ; i <= N ; i++)
{
for(int j = 1 ; j <= M ; j++)
{
stmax[i][j] = 0;
stmin[i][j] = 0;
}
fmax[i] = 1;
bmax[i] = 0;
fmin[i] = 1;
bmin[i] = 0;
}
}
int linii(int x, int y)
{
NR = 0;
int val = INF;
for(int i = x ; i <= N ; i++)
{
int Dmax[MMAX] = {0};
int fDmax = 1, bDmax = 0;
int Dmin[MMAX] = {0};
int fDmin = 1, bDmin = 0;
for(int j = 1 ; j <= M ; j++)
{
while(fDmax <= bDmax && Mmax[i][Dmax[bDmax]] <= Mmax[i][j])
bDmax--;
Dmax[++bDmax] = j;
if(Dmax[fDmax] < j - y + 1)
fDmax++;
while(fDmin <= bDmin && Mmin[i][Dmin[bDmin]] >= Mmin[i][j])
bDmin--;
Dmin[++bDmin] = j;
if(Dmin[fDmin] < j - y + 1)
fDmin++;
if(j >= y)
if(Mmax[i][Dmax[fDmax]] - Mmin[i][Dmin[fDmin]] < val)
{
val = Mmax[i][Dmax[fDmax]] - Mmin[i][Dmin[fDmin]];
NR = 1;
}
else if(Mmax[i][Dmax[fDmax]] - Mmin[i][Dmin[fDmin]] == val)
NR++;
}
}
return val;
}
void deque(int x, int y)
{
initializari();
for(int i = 1 ; i <= N ; i++)
{
for(int j = 1 ; j <= M ; j++)
{
while(fmax[j] <= bmax[j] && A[stmax[bmax[j]][j]][j] <= A[i][j])
bmax[j]--;
stmax[++bmax[j]][j] = i;
if(stmax[fmax[j]][j] < i - x + 1)
fmax[j]++;
while(fmin[j] <= bmin[j] && A[stmin[bmin[j]][j]][j] >= A[i][j])
bmin[j]--;
stmin[++bmin[j]][j] = i;
if(stmin[fmin[j]][j] < i - x + 1)
fmin[j]++;
}
if(i >= x)
for(int j = 1 ; j <= M ; j++)
{
Mmax[i][j] = A[stmax[fmax[j]][j]][j];
Mmin[i][j] = A[stmin[fmin[j]][j]][j];
}
}
}
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)
{
deque(x, y);
printf("%d %d",linii(x, y), NR);
}
else
{
deque(x, y);
//scrie();
int p = linii(x, y), NR2 = NR;
deque(y, x);
int q = linii(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, NR + NR2);
}
}
return 0;
}