Pagini recente » Cod sursa (job #246172) | Cod sursa (job #3173317) | Cod sursa (job #2226292) | Cod sursa (job #523783) | Cod sursa (job #2514523)
#define NMAX 1005
#include <fstream>
#include <deque>
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int n, m, p, dx, dy, difmin, nr;
int mat[NMAX][NMAX];
int maxi[NMAX][NMAX], mini[NMAX][NMAX];
int finmax[NMAX][NMAX], finmin[NMAX][NMAX];
deque<int> deqMin, deqMax;
void add(deque<int>& mind, deque<int>& maxd, int min_to_add, int max_to_add)
{
while(!mind.empty() && mind.back() > min_to_add)
mind.pop_back();
mind.push_back(min_to_add);
while(!maxd.empty() && maxd.back() < max_to_add)
maxd.pop_back();
maxd.push_back(max_to_add);
}
void read_mat()
{
f>>m>>n>>p;
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j)
f>>mat[i][j];
}
void solve(int dx, int dy)
{
for(int i = 1; i<=n; ++i)
{
deqMin.clear();
deqMax.clear();
for(int j=1; j<=dy; ++j)
add(deqMin, deqMax, mat[i][j], mat[i][j]);
for(int j=dy; j<=m; ++j)
{
mini[i][j] = deqMin.front();
maxi[i][j] = deqMax.front();
if(deqMin.front() == mat[i][j - dy + 1])
deqMin.pop_front();
if(deqMax.front() == mat[i][j - dy + 1])
deqMax.pop_front();
add(deqMin, deqMax, mat[i][j+1], mat[i][j+1]);
}
}
for(int j = dy; j <= m; ++j)
{
deqMin.clear();
deqMax.clear();
for(int i=1; i <= dx; ++i)
add(deqMin, deqMax, mini[i][j], maxi[i][j]);
for(int i = dx; i <= n; ++i)
{
int dif = deqMax.front() - deqMin.front();
if(dif < difmin)
{
difmin = dif;
nr = 1;
}
else if(dif == difmin)
nr ++;
if(deqMin.front() == mini[i-dx+1][j])
deqMin.pop_front();
if(deqMax.front() == maxi[i-dx+1][j])
deqMax.pop_front();
add(deqMin, deqMax, mini[i+1][j], maxi[i+1][j]);
}
}
}
void read_querry()
{
for(int i=1; i<=p; ++i)
{
difmin = 8005;
nr = 0;
f>>dx>>dy;
solve(dx, dy);
if(dx != dy)
solve(dy, dx);
g<<difmin<<" "<<nr<<'\n';
}
}
int main()
{
read_mat();
read_querry();
return 0;
}