Pagini recente » Cod sursa (job #2584447) | Cod sursa (job #1366677) | Cod sursa (job #2185326) | Cod sursa (job #3176344) | Cod sursa (job #2258557)
#include <fstream>
#include <cstring>
#include <climits>
#include <deque>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int M, N, P, minDif, minDifCount;
int matrix[1005][1005];
int minLine[1005][1005];
int maxLine[1005][1005];
int minMatrix[1005][1005];
int maxMatrix[1005][1005];
void Solve(int lin, int col)
{
memset(minLine, 0, sizeof(minLine));
memset(maxLine, 0, sizeof(maxLine));
memset(minMatrix, 0, sizeof(minMatrix));
memset(maxMatrix, 0, sizeof(maxMatrix));
///deque pentru min-ul fiecarei linii
for(int i = 1; i <= M; i++)
{
deque <int> deq;
for(int j = 1; j <= N; j++)
{
while(!deq.empty() && matrix[i][deq.back()] >= matrix[i][j])
deq.pop_back();
deq.push_back(j);
if(deq.back() - deq.front() >= col)
deq.pop_front();
if(j >= col)
minLine[i][j] = matrix[i][deq.front()];
}
}
///deque pentru max-ul fiecarei linii
for(int i = 1; i <= M; i++)
{
deque <int> deq;
for(int j = 1; j <= N; j++)
{
while(!deq.empty() && matrix[i][deq.back()] <= matrix[i][j])
deq.pop_back();
deq.push_back(j);
if(deq.back() - deq.front() >= col)
deq.pop_front();
if(j >= col)
maxLine[i][j] = matrix[i][deq.front()];
}
}
///deque pentru min-ul fiecarei matrici
for(int j = col; j <= N; j++)
{
deque <int> deq;
for(int i = 1; i <= M; i++)
{
while(!deq.empty() && minLine[deq.back()][j] >= minLine[i][j])
deq.pop_back();
deq.push_back(i);
if(deq.back() - deq.front() >= lin)
deq.pop_front();
if(i >= lin)
minMatrix[i][j] = minLine[deq.front()][j];
}
}
///deque pentru max-ul fiecarei matrici
for(int j = col; j <= N; j++)
{
deque <int> deq;
for(int i = 1; i <= M; i++)
{
while(!deq.empty() && maxLine[deq.back()][j] <= maxLine[i][j])
deq.pop_back();
deq.push_back(i);
if(deq.back() - deq.front() >= lin)
deq.pop_front();
if(i >= lin)
maxMatrix[i][j] = maxLine[deq.front()][j];
}
}
for(int i = lin; i <= M; i++)
for(int j = col; j <= N; j++)
if(maxMatrix[i][j] - minMatrix[i][j] == minDif)
minDifCount++;
else if(maxMatrix[i][j] - minMatrix[i][j] < minDif)
{
minDif = maxMatrix[i][j] - minMatrix[i][j];
minDifCount = 1;
}
}
void Read()
{
fin >> M >> N >> P;
for(int i = 1; i <= M; i++)
for(int j = 1; j <= N; j++)
fin >> matrix[i][j];
int dx, dy;
for(int i = 1; i <= P; i++)
{
minDif = INT_MAX;
minDifCount = 0;
fin >> dx >> dy;
Solve(dx, dy);
if(dx != dy)
Solve(dy, dx);
fout << minDif << ' ' << minDifCount << '\n';
}
}
int main()
{
Read();
return 0;
}