Pagini recente » Cod sursa (job #2523298) | Cod sursa (job #3203108) | Cod sursa (job #1743135) | Cod sursa (job #2191213) | Cod sursa (job #2514654)
#include <fstream>
#include <deque>
#include <climits>
#define MMAX 1005
#define NMAX 1005
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int n, m, p;
int a[NMAX][MMAX], matmin[NMAX][MMAX], matmax[NMAX][MMAX];
int dx, dy;
int difmin = INT_MAX, nr;
deque <int> minim;
deque <int> maxim;
void citire(){
f>>n>>m>>p;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
f>>a[i][j];
}
void adaug_in_minim(int i, int j){
while(!minim.empty() && minim.back()>a[i][j])
minim.pop_back();
minim.push_back(a[i][j]);
}
void adaug_in_maxim(int i, int j){
while(!maxim.empty() && maxim.back()<a[i][j])
maxim.pop_back();
maxim.push_back(a[i][j]);
}
void adaug_in_minim_nou(int i, int j){
while(!minim.empty() && minim.back()>matmin[i][j])
minim.pop_back();
minim.push_back(matmin[i][j]);
}
void adaug_in_maxim_nou(int i, int j){
while(!maxim.empty() && maxim.back()<matmax[i][j])
maxim.pop_back();
maxim.push_back(matmax[i][j]);
}
void elimin(int i, int j){
if(!maxim.empty() && maxim.front() == a[i][j-dy+1])
maxim.pop_front();
if(!minim.empty() && minim.front() == a[i][j-dy+1])
minim.pop_front();
}
void elimin_nou(int i, int j){
if(!maxim.empty() && maxim.front() == matmax[i-dx+1][j])
maxim.pop_front();
if(!minim.empty() && minim.front() == matmin[i-dx+1][j])
minim.pop_front();
}
void solve(){
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
adaug_in_minim(i, j);
adaug_in_maxim(i, j);
if(j>=dy-1){
matmin[i][j-dy+1]=minim.front();
matmax[i][j-dy+1]=maxim.front();
elimin(i, j);
}
}
minim.clear();
maxim.clear();
}
for(int j=0; j<m-dy+1; j++){
for(int i=0; i<n; i++){
adaug_in_minim_nou(i, j);
adaug_in_maxim_nou(i, j);
if(i>=dx-1){
int dif = maxim.front() - minim.front();
if(dif<difmin){
difmin = dif;
nr=1;
}
else if(dif == difmin)
nr++;
elimin_nou(i, j);
}
}
minim.clear();
maxim.clear();
}
}
int main()
{
citire();
for(int i=0; i<p; i++)
{
difmin = INT_MAX;
nr=0;
f>>dx>>dy;
solve();
if(dx!=dy){
swap(dx, dy);
solve();
}
g<<difmin<<" "<<nr<<'\n';
}
return 0;
}