Pagini recente » Cod sursa (job #1803882) | Cod sursa (job #179602) | Cod sursa (job #619704) | Cod sursa (job #395486) | Cod sursa (job #2895165)
#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(){
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);
cout << min_sol << ' ' << nr << endl;
}
return 0;
}