Pagini recente » Cod sursa (job #3209321) | Cod sursa (job #1774419) | Cod sursa (job #594301) | Cod sursa (job #2615456) | Cod sursa (job #3178689)
#include <fstream>
#include <deque>
using namespace std;
const int N = 1000;
const int INF = 2e7;
int nl, nc, a[N][N], val_min[N][N], val_max[N][N];
ofstream out("struti.out");
void coloana_min_max(int col, int dl)
{
deque <int> dqmax, dqmin;
for (int i = 0; i < nl; i++)
{
if (!dqmax.empty() && dqmax.front() == i - dl)
{
dqmax.pop_front();
}
while (!dqmax.empty() && a[i][col] >= a[dqmax.back()][col])
{
dqmax.pop_back();
}
dqmax.push_back(i);
if (!dqmin.empty() && dqmin.front() == i - dl)
{
dqmin.pop_front();
}
while (!dqmin.empty() && a[i][col] <= a[dqmin.back()][col])
{
dqmin.pop_back();
}
dqmin.push_back(i);
if (i >= dl - 1)
{
val_max[i][col] = a[dqmax.front()][col];
val_min[i][col] = a[dqmin.front()][col];
}
}
}
void constructie_min_max(int dl, int dc)
{
for (int c = 0; c < nc; c++)
{
coloana_min_max(c, dl);
}
}
void dif_numar_matrice(int dl, int dc, int &dif_min, int &nr_mat)
{
dif_min = INF;
nr_mat = 0;
//out << "\ndl = " << dl << "\tdc = " << dc << "\n";
for (int i = dl - 1; i < nl; i++)
{
deque <int> dqmax, dqmin;
while (!dqmax.empty())
{
dqmax.pop_back();
}
while (!dqmin.empty())
{
dqmin.pop_back();
}
for (int j = 0; j < nc; j++)
{
if (!dqmax.empty() && dqmax.front() == j - dc)
{
dqmax.pop_front();
}
while (!dqmax.empty() && val_max[i][j] >= val_max[i][dqmax.back()])
{
dqmax.pop_back();
}
dqmax.push_back(j);
if (!dqmin.empty() && dqmin.front() == j - dc)
{
dqmin.pop_front();
}
while (!dqmin.empty() && val_min[i][j] <= val_min[i][dqmin.back()])
{
dqmin.pop_back();
}
dqmin.push_back(j);
//out << i << ", " << j << "\t max = " << val_max[i][dqmax.front()];
//out << "\t min = " << val_min[i][dqmin.front()] << "\n";
if (j >= dc - 1)
{
int dif_c = val_max[i][dqmax.front()] - val_min[i][dqmin.front()];
if (dif_c < dif_min)
{
dif_min = dif_c;
nr_mat = 1;
}
else if (dif_c == dif_min)
{
nr_mat++;
}
}
}
}
}
int main()
{
ifstream in("struti.in");
int nq;
in >> nl >> nc >> nq;
for (int i = 0; i < nl; i++)
{
for (int j = 0; j < nc; j++)
{
in >> a[i][j];
}
}
for (int i = 0; i < nq; i++)
{
int dl, dc, nr_mat, dif_min;
in >> dl >> dc;
constructie_min_max(dl, dc);
dif_numar_matrice(dl, dc, dif_min, nr_mat);
if (dl != dc)
{
constructie_min_max(dc, dl);
int nr_mat_inv, dif_min_inv;
dif_numar_matrice(dc, dl, dif_min_inv, nr_mat_inv);
if (dif_min_inv < dif_min)
{
dif_min = dif_min_inv;
nr_mat = nr_mat_inv;
}
else if (dif_min_inv == dif_min)
{
nr_mat += nr_mat_inv;
}
}
out << dif_min << " " << nr_mat << "\n";
}
in.close();
out.close();
return 0;
}