Pagini recente » Cod sursa (job #2076374) | Cod sursa (job #257953) | Cod sursa (job #3182181) | Cod sursa (job #419940) | Cod sursa (job #2059810)
#include <iostream>
#include <math.h>
using namespace std;
const int DIM = 1001;
int alp[DIM][DIM], d[DIM * DIM], mx[DIM][DIM], mn[DIM][DIM], n, m, p, dx[DIM], dm[DIM];
int dmx(int x);
int all(int x, int y, int& mini);
int main()
{
int dx, dy;
cin >> n >> m >> p;
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= m; ++j)
cin >> alp[i][j];
}
for(int i = 1; i <= p; ++i)
{
cin >> dx >> dy;
int mini = 9000, nrt = 0, mnou;
dmx(dx);
nrt += all(dx, dy, mini);
if(dx != dy)
{
dmx(dy);
nrt += all(dy, dx, mini);
}
cout << mini << ' ' << nrt << '\n';
}
return 0;
}
int all(int x, int y, int& mini)
{
int dif = 3920243, t = 0;
for(int i = x; i <= n; ++i)
{
int st = 0, dr = -1, sti = 0, dri = -1;
dif = 9301291;
for(int j = 1; j <= m; ++j)
{
if(st <= dr && dx[st] == j - y)
{
++st;
}
while(st <= dr && mx[i][j] >= mx[i][dx[dr]])
{
--dr;
}
dx[++dr] = j;
if(sti <= dri && dx[sti] == j - y)
{
++sti;
}
while(sti <= dri && mx[i][j] >= mx[i][dm[dri]])
{
--dri;
}
dx[++dri] = j;
if(mx[i][dx[st]] - mn[i][dm[sti]] == dif) ++t;
else if(mx[i][dx[st]] - mn[i][dm[sti]] < dif)
{
dif = mx[i][dx[st]] - mn[i][dm[sti]];
t = 1;
}
}
}
cout << dif << endl;
mini = dif;
return t;
}
int dmx(int x)
{
for(int j = 1; j <= m; ++j)
{
int st = 0, dr = -1, sti = 0, dri = -1;
for(int i = 1; i <= n; ++i)
{
if(st <= dr && dx[st] == i - x )
++st;
while(st <= dr && alp[i][j] >= alp[dx[dr]][j])
{
--dr;
}
dx[++dr] = i;
if(i >= x)
mx[i][j] = alp[dx[st]][j];
///URMEAZA PENTRU MINIM
if(sti <= dri && dm[sti] == i - x)
++sti;
while(sti <= dri && alp[i][j] <= alp[dm[dri]][j])
{
--dri;
}
dm[++dri] = i;
if(i >= x)
mx[i][j] = alp[dm[sti]][j];
}
}
}