Pagini recente » Cod sursa (job #1181295) | Cod sursa (job #1409900) | Cod sursa (job #2147225) | Cod sursa (job #1072613)
#include <iostream>
#include <fstream>
const static int NMAX = 1001, MMAX = 1001;
const static int MAXVAL = 8001;
using namespace std;
int matrix[NMAX][MMAX];
int minMatrix[NMAX][MMAX];
int maxMatrix[NMAX][MMAX];
pair<int,int> dequeMIN[NMAX * MMAX + 1];
pair<int,int> dequeMAX[NMAX * MMAX + 1];
int headMIN = 0 , tailMIN = 0;
int headMAX = 0 , tailMAX = 0;
ifstream input("struti.in");
ofstream output("struti.out");
int N , M , P;
int answer , numApp = 0;
int search(int x , int y)
{
for (int j = 1 ; j <= M ; j++)
{
tailMIN = 0;
tailMAX = 0;
headMIN = 1;
headMAX = 1;
for (int i = 1; i < x ; i++)
{
while(tailMIN >= headMIN && dequeMIN[tailMIN].first >= matrix[i][j]) tailMIN --;
while(tailMAX >= headMAX && dequeMAX[tailMAX].first <= matrix[i][j]) tailMAX --;
dequeMIN[++tailMIN] = make_pair(matrix[i][j],i);
dequeMAX[++tailMAX] = make_pair(matrix[i][j],i);
}
for (int i = x ; i <= N ; i++)
{
while(tailMIN >= headMIN && dequeMIN[tailMIN].first >= matrix[i][j]) tailMIN --;
while(tailMAX >= headMAX && dequeMAX[tailMAX].first <= matrix[i][j]) tailMAX --;
dequeMIN[++tailMIN] = make_pair(matrix[i][j],i);
dequeMAX[++tailMAX] = make_pair(matrix[i][j],i);
if (dequeMIN[headMIN].second <= i - x) headMIN ++ ;
if (dequeMAX[headMAX].second <= i - x) headMAX ++ ;
minMatrix[i][j] = dequeMIN[headMIN].first;
maxMatrix[i][j] = dequeMAX[headMAX].first;
}
}
for (int i = x; i <= N ; i++)
{
tailMIN = 0;
tailMAX = 0;
headMIN = 1;
headMAX = 1;
for (int j = 1; j < y ; j++)
{
while(tailMIN >= headMIN && dequeMIN[tailMIN].first >= minMatrix[i][j]) tailMIN --;
while(tailMAX >= headMAX && dequeMAX[tailMAX].first <= maxMatrix[i][j]) tailMAX --;
dequeMIN[++tailMIN] = make_pair(minMatrix[i][j],j);
dequeMAX[++tailMAX] = make_pair(maxMatrix[i][j],j);
}
for (int j = y ; j <= M ; j++)
{
while(tailMIN >= headMIN && dequeMIN[tailMIN].first >= minMatrix[i][j]) tailMIN --;
while(tailMAX >= headMAX && dequeMAX[tailMAX].first <= maxMatrix[i][j]) tailMAX --;
dequeMIN[++tailMIN] = make_pair(minMatrix[i][j],j);
dequeMAX[++tailMAX] = make_pair(maxMatrix[i][j],j);
if (dequeMIN[headMIN].second <= j - y) headMIN ++;
if (dequeMAX[headMAX].second <= j - y) headMAX ++;
minMatrix[i][j] = dequeMIN[headMIN].first;
maxMatrix[i][j] = dequeMAX[headMAX].first;
if (answer > maxMatrix[i][j] - minMatrix[i][j])
{
answer = maxMatrix[i][j] - minMatrix[i][j];
numApp = 1;
}
else if (answer == maxMatrix[i][j] - minMatrix[i][j])
{
numApp ++;
}
}
}
}
int main()
{
input >> N >> M >> P;
for (int i = 1; i <= N ; i++)
for (int j = 1;j <= M ; j++)
input >> matrix[i][j];
for (int i = 0; i < P ; i++)
{
answer = MAXVAL;
numApp = 0;
int x , y;
input >> x >> y;
search(x,y);
if (x != y) search(y,x);
output << answer << " " << numApp << "\n";
}
input.close();
output.close();
return 0;
}