Pagini recente » Cod sursa (job #1365871) | Cod sursa (job #1961517) | Cod sursa (job #2876784) | Cod sursa (job #143751) | Cod sursa (job #2269717)
#include <iostream>
#include <fstream>
#include <deque>
#define NMAX 1010
#define minx minVal[i][j].x
#define miny minVal[i][j].y
#define maxx maxVal[i][j].x
#define maxy maxVal[i][j].y
using namespace std;
struct
{
int x, y;
}minVal[NMAX][NMAX], maxVal[NMAX][NMAX];
int matrix[NMAX][NMAX];
deque < pair < int , int > > minAlt;
deque < pair < int , int > > maxAlt;
int main()
{
ifstream fin("struti.in");
ofstream fout("struti.out");
int n, m, p, x, y, k, kAux, sol, nrSol;
fin >> n >> m >> p;
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
fin >> matrix[i][j];
for (int e=0; e<p; e++)
{
sol = 8005;
nrSol = 0;
fin >> x >> y;
for (int j=1; j<=m; j++)
{
k = 0;
minAlt.push_back(make_pair(1, j));
maxAlt.push_back(make_pair(1, j));
for (int i=2; i<=n; i++)
{
while(matrix[minAlt.back().first][minAlt.back().second]>matrix[i][j])
{
minAlt.pop_back();
if (minAlt.empty())
break;
}
minAlt.push_back(make_pair(i ,j));
if (minAlt.front().first<=i-x)
minAlt.pop_front();
while(matrix[maxAlt.back().first][maxAlt.back().second]<matrix[i][j])
{
maxAlt.pop_back();
if (maxAlt.empty())
break;
}
maxAlt.push_back(make_pair(i ,j));
if (maxAlt.front().first<=i-x)
maxAlt.pop_front();
if (i>=x)
{
k++;
minVal[k][j].x = minAlt.front().first;
minVal[k][j].y = minAlt.front().second;
maxVal[k][j].x = maxAlt.front().first;
maxVal[k][j].y = maxAlt.front().second;
}
}
while(!minAlt.empty())
minAlt.pop_back();
while(!maxAlt.empty())
maxAlt.pop_back();
}
for (int i=1; i<=k; i++)
{
minAlt.push_back(make_pair(minVal[i][1].x, minVal[i][1].y));
maxAlt.push_back(make_pair(maxVal[i][1].x, maxVal[i][1].y));
for (int j=2; j<=m; j++)
{
while(matrix[minAlt.back().first][minAlt.back().second]>matrix[minx][miny])
{
minAlt.pop_back();
if (minAlt.empty())
break;
}
while(matrix[maxAlt.back().first][maxAlt.back().second]<matrix[maxx][maxy])
{
maxAlt.pop_back();
if (maxAlt.empty())
break;
}
minAlt.push_back(make_pair(minx, miny));
maxAlt.push_back(make_pair(maxx, maxy));
if (minAlt.front().second<=j-y)
minAlt.pop_front();
if (maxAlt.front().second<=j-y)
maxAlt.pop_front();
int dif = (matrix[maxAlt.front().first][maxAlt.front().second]-matrix[minAlt.front().first][minAlt.front().second]);
if (j>=y)
{
if (sol>dif)
{
nrSol = 1;
sol = dif;
}
else
if (sol==dif)
nrSol ++;
}
}
while(!minAlt.empty())
minAlt.pop_back();
while(!maxAlt.empty())
maxAlt.pop_back();
}
if (x!=y)
{
for (int j=1; j<=m; j++)
{
k = 0;
minAlt.push_back(make_pair(1, j));
maxAlt.push_back(make_pair(1, j));
for (int i=2; i<=n; i++)
{
while(matrix[minAlt.back().first][minAlt.back().second]>matrix[i][j])
{
minAlt.pop_back();
if (minAlt.empty())
break;
}
minAlt.push_back(make_pair(i ,j));
if (minAlt.front().first<=i-y)
minAlt.pop_front();
while(matrix[maxAlt.back().first][maxAlt.back().second]<matrix[i][j])
{
maxAlt.pop_back();
if (maxAlt.empty())
break;
}
maxAlt.push_back(make_pair(i ,j));
if (maxAlt.front().first<=i-y)
maxAlt.pop_front();
if (i>=y)
{
k++;
minVal[k][j].x = minAlt.front().first;
minVal[k][j].y = minAlt.front().second;
maxVal[k][j].x = maxAlt.front().first;
maxVal[k][j].y = maxAlt.front().second;
}
}
while(!minAlt.empty())
minAlt.pop_back();
while(!maxAlt.empty())
maxAlt.pop_back();
}
for (int i=1; i<=k; i++)
{
minAlt.push_back(make_pair(minVal[i][1].x, minVal[i][1].y));
maxAlt.push_back(make_pair(maxVal[i][1].x, maxVal[i][1].y));
for (int j=2; j<=m; j++)
{
while(matrix[minAlt.back().first][minAlt.back().second]>matrix[minx][miny])
{
minAlt.pop_back();
if (minAlt.empty())
break;
}
while(matrix[maxAlt.back().first][maxAlt.back().second]<matrix[maxx][maxy])
{
maxAlt.pop_back();
if (maxAlt.empty())
break;
}
minAlt.push_back(make_pair(minx, miny));
maxAlt.push_back(make_pair(maxx, maxy));
if (minAlt.front().second<=j-x)
minAlt.pop_front();
if (maxAlt.front().second<=j-x)
maxAlt.pop_front();
int dif = (matrix[maxAlt.front().first][maxAlt.front().second]-matrix[minAlt.front().first][minAlt.front().second]);
if (j>=x)
{
if (sol>dif)
{
nrSol = 1;
sol = dif;
}
else
if (sol==dif)
nrSol ++;
}
}
while(!minAlt.empty())
minAlt.pop_back();
while(!maxAlt.empty())
maxAlt.pop_back();
}
}
fout << sol << " " << nrSol << "\n";
}
return 0;
}