Pagini recente » Cod sursa (job #1527787) | Cod sursa (job #3209885) | Cod sursa (job #481302) | Cod sursa (job #30524) | Cod sursa (job #2895187)
#include <iostream>
#include <fstream>
#include <deque>
#include <climits>
using namespace std;
const int dim = 1e3 + 5;
int a[dim][dim], maxx[dim][dim], minn[dim][dim], min_sol = INT_MAX, nr;
int n, m, q;
deque<int> dqmin, dqmax;
void first_pos(int A, int B){
for(int j = 1; j <= m; j++){
dqmax.clear();
dqmin.clear();
for(int i = 1; i <= n; i++){
while(!dqmax.empty() and a[dqmax.back()][j] <= a[i][j]){
dqmax.pop_back();
}
while(!dqmin.empty() and a[dqmin.back()][j] >= a[i][j]){
dqmin.pop_back();
}
dqmax.push_back(i);
dqmin.push_back(i);
if(dqmax.front() <= i - A){
dqmax.pop_front();
}
if(dqmin.front() <= i - A){
dqmin.pop_front();
}
if(i >= A){
maxx[i][j] = a[dqmax.front()][j];
minn[i][j] = a[dqmin.front()][j];
}
}
}
}
void second_pos(int A, int B){
for(int i = A; i <= n; i++){
dqmin.clear();
dqmax.clear();
for(int j = 1; j <= m; j++){
while(!dqmax.empty() and maxx[i][dqmax.back()] <= maxx[i][j]){
dqmax.pop_back();
}
while(!dqmin.empty() and minn[i][dqmin.back()] >= minn[i][j]){
dqmin.pop_back();
}
dqmax.push_back(j);
dqmin.push_back(j);
if(dqmax.front() <= j - B){
dqmax.pop_front();
}
if(dqmin.front() <= j - B){
dqmin.pop_front();
}
if(j >= B and maxx[i][dqmax.front()] - minn[i][dqmin.front()] < min_sol){
min_sol = maxx[i][dqmax.front()] - minn[i][dqmin.front()];
nr = 1;
}
else
if(j >= B and maxx[i][dqmax.front()] - minn[i][dqmin.front()] == min_sol){
nr++;
}
}
}
}
int main(){
ios_base :: sync_with_stdio(false);
cin.tie(0);
ifstream cin("struti.in");
ofstream cout("struti.out");
cin >> n >> m >> q;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
cin >> a[i][j];
}
}
while(q--){
int A, B;
cin >> A >> B;
nr = 0, min_sol = INT_MAX;
first_pos(A, B);
second_pos(A, B);
if(A != B){
first_pos(B, A);
second_pos(B, A);
}
cout << min_sol << ' ' << nr << endl;
}
return 0;
}
//MBVM MOVTM