Pagini recente » Cod sursa (job #2036573) | Cod sursa (job #1219621) | Cod sursa (job #1916753) | Cod sursa (job #1019618) | Cod sursa (job #1843479)
#include <fstream>
using namespace std;
ifstream in("struti.in");
ofstream out("struti.out");
const int MAXN = 1005;
int v[MAXN][MAXN];
int n,m;
int raspoferta, nroferta;
int dequemin[MAXN], dequemax[MAXN];
int bmin[MAXN][MAXN], bmax[MAXN][MAXN];
bool cmpmin(int a, int b)
{
return a <= b;
}
bool cmpmax(int a, int b)
{
return a >= b;
}
void creare_matrice(int dy, int Deque[], int mat[MAXN][MAXN], bool (*cmp)(int, int))
{
for (int i = 1;i <= n;++i)
{
int p = 1, q = 0;
for (int j = 1;j <= m;++j)
{
while(p <= q && !cmp(v[i][Deque[q]], v[i][j]))
--q;
Deque[++q] = j;
while(Deque[p] <= j - dy)
++p;
if (j >= dy)
mat[i][j] = v[i][Deque[p]];
}
}
}
void actualizare_rasp(int rasp)
{
if (rasp == raspoferta)
++nroferta;
if (rasp < raspoferta)
{
raspoferta = rasp;
nroferta = 1;
}
}
void calculare_oferta(int dx, int dy)
{
creare_matrice(dy, dequemin, bmin, &cmpmin);
creare_matrice(dy, dequemax, bmax, &cmpmax);
raspoferta = 1 << 29;
for (int j = dy;j <= m;++j)
{
int pmin = 1, qmin = 0;
int pmax = 1, qmax = 0;
for (int i = 1;i <= n;++i)
{
while(pmin <= qmin && bmin[dequemin[qmin]][j] >= bmin[i][j])
--qmin;
dequemin[++qmin] = i;
while(dequemin[pmin] <= i - dx)
++pmin;
while(pmax <= qmax && bmax[dequemax[qmax]][j] <= bmax[i][j])
--qmax;
dequemax[++qmax] = i;
while(dequemax[pmax] <= i - dx)
++pmax;
if (i >= dx)
actualizare_rasp(bmax[dequemax[pmax]][j] - bmin[dequemin[pmin]][j]);
}
}
}
int main()
{
int p;
in >> n >> m >> p;
for (int i = 1;i <= n;++i)
for (int j = 1;j <= m;++j)
in >> v[i][j];
while(p > 0)
{
int dx,dy;
in >> dx >> dy;
calculare_oferta(dx, dy);
int rasp = raspoferta, nr = nroferta;
if (dx != dy)
{
calculare_oferta(dy,dx);
if (raspoferta < rasp)
{
rasp = raspoferta;
nr = nroferta;
}
else if (raspoferta == rasp)
nr += nroferta;
}
out << rasp << ' ' << nr << '\n';
--p;
}
return 0;
}