Pagini recente » Cod sursa (job #308360) | Cod sursa (job #185178) | Cod sursa (job #952254) | Cod sursa (job #1218565) | Cod sursa (job #1261278)
#include<fstream>
using namespace std;
int n, m, i, j, k, p1, u1, p2, u2, a, b, minim, nr, dif, aux;
int A[1001][1001], B[1001][1001], C[1001][1001], d1[1001], d2[1001];
ifstream fin("struti.in");
ofstream fout("struti.out");
int main(){
fin>> n >> m >> k;
for(i = 1; i <= n; i++){
for(j = 1; j <= m; j++){
fin>> A[i][j];
}
}
for(; k; k--){
fin>> a >> b;
minim = 8000;
nr = 0;
for(i = 1; i <= n; i++){
p1 = 1;
u1 = 1;
p2= 1;
u2 = 1;
d1[1] = 1;
d2[1] = 1;
for(j = 2; j <= m; j++){
while(p1 <= u1 && A[i][j] < A[i][d1[u1]]){
u1--;
}
u1++;
d1[u1] = j;
if(j - d1[p1] == b){
p1++;
}
if(j >= b){
B[i][j] = A[i][d1[p1]];
}
while(p2 <= u2 && A[i][j] > A[i][d2[u2]]){
u2--;
}
u2++;
d2[u2] = j;
if(j - d2[p2] == b){
p2++;
}
if(j >= b){
C[i][j] = A[i][d2[p2]];
}
}
}
for(j = b; j <= m; j++){
p1 = 1;
u1 = 1;
p2 = 1;
u2 = 1;
d1[1] = 1;
d2[1] = 1;
for(i = 2; i <= n; i++){
while(p1 <= u1 && B[i][j] < B[d1[u1]][j]){
u1--;
}
u1++;
d1[u1] = i;
if(i - d1[p1] == a){
p1++;
}
while(p2 <= u2 && C[i][j] > C[d2[u2]][j]){
u2--;
}
u2++;
d2[u2] = i;
if(i - d2[p2] == a){
p2++;
}
if(i >= a){
dif = C[d2[p2]][j] - B[d1[p1]][j];
if(dif < minim){
minim = dif;
nr = 1;
}
else{
if(dif == minim){
nr++;
}
}
}
}
}
if(a != b){
aux = a;
a = b;
b = aux;
for(i = 1; i <= n; i++){
p1 = 1;
u1 = 1;
p2= 1;
u2 = 1;
d1[1] = 1;
d2[1] = 1;
for(j = 2; j <= m; j++){
while(p1 <= u1 && A[i][j] < A[i][d1[u1]]){
u1--;
}
u1++;
d1[u1] = j;
if(j - d1[p1] == b){
p1++;
}
if(j >= b){
B[i][j] = A[i][d1[p1]];
}
while(p2 <= u2 && A[i][j] > A[i][d2[u2]]){
u2--;
}
u2++;
d2[u2] = j;
if(j - d2[p2] == b){
p2++;
}
if(j >= b){
C[i][j] = A[i][d2[p2]];
}
}
}
for(j = b; j <= m; j++){
p1 = 1;
u1 = 1;
p2 = 1;
u2 = 1;
d1[1] = 1;
d2[1] = 1;
for(i = 2; i <= n; i++){
while(p1 <= u1 && B[i][j] < B[d1[u1]][j]){
u1--;
}
u1++;
d1[u1] = i;
if(i - d1[p1] == a){
p1++;
}
while(p2 <= u2 && C[i][j] > C[d2[u2]][j]){
u2--;
}
u2++;
d2[u2] = i;
if(i - d2[p2] == a){
p2++;
}
if(i >= a){
dif = C[d2[p2]][j] - B[d1[p1]][j];
if(dif < minim){
minim = dif;
nr = 1;
}
else{
if(dif == minim){
nr++;
}
}
}
}
}
}
fout<< minim <<" "<< nr <<"\n";
}
return 0;
}