Pagini recente » Cod sursa (job #2857295) | Cod sursa (job #1835586) | Cod sursa (job #2109113) | Cod sursa (job #856837) | Cod sursa (job #2455143)
#include <bits/stdc++.h>
#define MAX 131072
using namespace std;
const int NMAX = 1010;
FILE *IN;
int ans, nrplace;
int N, M, P;
int mat[NMAX][NMAX], mMaxL[NMAX][NMAX], mMinL[NMAX][NMAX], mMaxC[NMAX][NMAX], mMinC[NMAX][NMAX];
deque <int> dmin, dmax;
int pos, sign;
char f[MAX];
inline void Read(int &nr){
sign = 0;
nr = 0;
while(f[pos] < '0' || f[pos] > '9'){
if(f[pos] == '-') sign = 1;
pos++;
if(pos == MAX)
fread(f, MAX, 1, IN), pos = 0;
}
while(f[pos] >= '0' && f[pos] <= '9'){
nr = 10 * nr + f[pos++] - '0';
if(pos == MAX)
fread(f, MAX, 1, IN), pos = 0;
}
if(sign) nr =- nr;
}
inline void read(){
Read(N); Read(M); Read(P);
for(int i = 1; i <= N; i++)
for(int j = 1; j <= M; j++)
Read(mat[i][j]);
}
inline void solve(int x, int y){
for(int i = 1; i <= N; i++){
dmin.clear();
dmax.clear();
for(int j = 1; j <= M; j++){
while(!dmin.empty() && mat[i][dmin.back()] > mat[i][j])
dmin.pop_back();
dmin.push_back(j);
if(dmin.front() <= j - x)
dmin.pop_front();
if(j - x >= 0)
mMinL[i][j - x + 1] = mat[i][dmin.front()];
while(!dmax.empty() && mat[i][dmax.back()] < mat[i][j])
dmax.pop_back();
dmax.push_back(j);
if(dmax.front() <= j - x)
dmax.pop_front();
if(j - x >= 0)
mMaxL[i][j - x + 1] = mat[i][dmax.front()];
}
}
for(int j = 1; j <= M - x + 1; j++){
dmin.clear();
dmax.clear();
for(int i = 1; i <= N; i++){
while(!dmin.empty() && mMinL[i][j] < mMinL[dmin.back()][j])
dmin.pop_back();
dmin.push_back(i);
if(dmin.front() <= i - y)
dmin.pop_front();
if(i - y >= 0)
mMinC[i - y + 1][j] = mMinL[dmin.front()][j];
while(!dmax.empty() && mMaxL[i][j] > mMaxL[dmax.back()][j])
dmax.pop_back();
dmax.push_back(i);
if(dmax.front() <= i - y)
dmax.pop_front();
if(i - y >= 0)
mMaxC[i - y + 1][j] = mMaxL[dmax.front()][j];
}
}
for(int i = 1; i <= N - y + 1; i++){
for(int j = 1; j <= M - x + 1; j++){
if(ans > mMaxC[i][j] - mMinC[i][j])
ans = mMaxC[i][j] - mMinC[i][j], nrplace = 1;
else if(ans == mMaxC[i][j] - mMinC[i][j])
nrplace++;
}
}
}
int main(){
IN = fopen("struti.in", "r");
freopen("struti.out", "w", stdout);
read();
int x, y;
for(int i = 1; i <= P; i++){
ans = 2e9; nrplace = 0;
Read(x); Read(y);
solve(x, y);
if(x != y) solve(y, x);
printf("%d %d\n", ans, nrplace);
}
return 0;
}