Pagini recente » Cod sursa (job #1343151) | Cod sursa (job #991332) | Cod sursa (job #254888) | Cod sursa (job #2029618) | Cod sursa (job #1355926)
#include <fstream>
#define DIM 1001
using namespace std;
ifstream fin ("struti.in" );
ofstream fout("struti.out");
int N, M, i, j, k, ok, minim, P, p;
int A[DIM][DIM], val , u, deque[DIM];
int D1Min[DIM][DIM], D2Min[DIM][DIM];
int D1Max[DIM][DIM], D2Max[DIM][DIM];
int DX, DY, t, nr;
void Set_Up(){
fin >> N >> M >> P;
for(i = 1; i <= N; i ++)
for(j = 1; j <= M; j ++)
fin >> A[i][j];
return;
}
void Deque_1_Min(){
for(i = 1; i <= N; i ++){
/*
FAC DEQUE PT FIECARE LINIE
IN PARTE A MATRICII A
*/
deque[1] = 1; p = u = 1; t = 0;
for(j = 2; j <= M; j ++){
while(p <= u && A[i][j] < A[i][deque[u]])
u --;
u ++; deque[u] = j;
if(j - deque[p] == DY)
p ++;
if(j >= DY)
D1Min[i][++t] = A[i][deque[p]];
}
}
return;
}
void Deque_2_Min(){
for(j = 1; j <= M; j ++){
/*
FAC DEQUE PT FIECARE COLOANA
IN PARTE A MATRICII D1Min
*/
deque[1] = 1; p = u = 1; t = 0;
for(i = 2; i <= N; i ++){
while(p <= u && D1Min[i][j] < D1Min[deque[u]][j])
u --;
u ++; deque[u] = i;
if(i - deque[p] == DX)
p ++;
if(i >= DX)
D2Min[++t][j] = D1Min[deque[p]][j];
}
}
return;
}
void Deque_1_Max(){
for(i = 1; i <= N; i ++){
/*
FAC DEQUE PT FIECARE LINIE
IN PARTE A MATRICII A
*/
deque[1] = 1; p = u = 1; t = 0;
for(j = 2; j <= M; j ++){
while(p <= u && A[i][j] > A[i][deque[u]])
u --;
u ++; deque[u] = j;
if(j - deque[p] == DY)
p ++;
if(j >= DY)
D2Max[i][++t] = A[i][deque[p]];
}
}
return;
}
void Deque_2_Max(){
for(j = 1; j <= M; j ++){
/*
FAC DEQUE PT FIECARE COLOANA
IN PARTE A MATRICII D1Max
*/
deque[1] = 1; p = u = 1; t = 0;
for(i = 2; i <= N; i ++){
while(p <= u && D1Max[i][j] > D1Max[deque[u]][j])
u --;
u ++; deque[u] = i;
if(i - deque[p] == DX)
p ++;
if(i >= DX)
D2Max[++t][j] = D1Max[deque[p]][j];
}
}
return;
}
void Search(){
minim = 2000000000;
for(i = 1; i <= N - DX + 1; i ++)
for(j = 1; j <= M - DY + 1; j ++)
if(D2Max[i][j] - D2Min[i][j] < minim){
minim = D2Max[i][j] - D2Min[i][j];
nr = 1;
}
else
if(D2Max[i][j] - D2Min[i][j] == minim)
nr ++;
return;
}
void Querys(){
for(k = 1; k <= P; k ++){
fin >> DX >> DY;
Deque_1_Min(); Deque_2_Min();
Deque_1_Max(); Deque_2_Max();
Search();
fout << minim << " " << nr << "\n";
}
return;
}
int main(){
Set_Up();
Querys();
return 0;
}