Pagini recente » Cod sursa (job #698655) | Cod sursa (job #665279) | Cod sursa (job #2905313) | Cod sursa (job #2699201) | Cod sursa (job #2119231)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1001;
int mat[MAXN][MAXN];
int maxim[MAXN][MAXN];
int minim[MAXN][MAXN];
void solve(int n, int m, int dx, int dy, int &ans, int &cnt){
for(int j = 0; j < m; ++j){
deque< int > maxx;
deque< int > minn;
for(int i = 0; i < n; ++i){
while(maxx.size() && mat[maxx.back()][j] <= mat[i][j]) maxx.pop_back();
while(minn.size() && mat[minn.back()][j] >= mat[i][j]) minn.pop_back();
maxx.push_back(i);
minn.push_back(i);
if(i - maxx.front() == dx) maxx.pop_front();
if(i - minn.front() == dx) minn.pop_front();
maxim[i][j] = mat[maxx.front()][j];
minim[i][j] = mat[minn.front()][j];
}
}
for(int i = dx - 1; i < n; ++i){
deque< int > maxx;
deque< int > minn;
for(int j = 0 ; j < dy - 1; ++j){
while(maxx.size() && maxim[i][maxx.back()] <= maxim[i][j]) maxx.pop_back();
while(minn.size()&& minim[i][minn.back()] >= minim[i][j]) minn.pop_back();
maxx.push_back(j);
minn.push_back(j);
if(j - maxx.front() == dy) maxx.pop_front();
if(j - minn.front() == dy) minn.pop_front();
}
for(int j = dy - 1; j < m; ++j){
while(maxx.size() && maxim[i][maxx.back()] < maxim[i][j]) maxx.pop_back();
while(minn.size() && minim[i][minn.back()] > minim[i][j]) minn.pop_back();
maxx.push_back(j);
minn.push_back(j);
if(j - maxx.front() == dy) maxx.pop_front();
if(j - minn.front() == dy) minn.pop_front();
int curr = maxim[i][maxx.front()] - minim[i][minn.front()];
if(curr < ans) ans = curr, cnt = 0;
if(curr == ans) ++cnt;
}
}
}
int main(){
ifstream f("struti.in");
ofstream g("struti.out");
int n, m, p;
f >> n >> m >> p;
for(int i = 0; i < n; ++i){
for(int j = 0; j < m; ++j){
f >> mat[i][j];
}
}
while(p--){
int dx, dy;
f >> dx >> dy;
int ans = 1e9;
int cnt = 0;
solve(n, m, dx, dy, ans, cnt);
if(dx != dy) solve(n, m, dy, dx, ans, cnt);
g << ans << ' ' << cnt << '\n';
}
return 0;
}