Pagini recente » Cod sursa (job #1873131) | Cod sursa (job #2435367) | Cod sursa (job #2282584) | Cod sursa (job #1838250) | Cod sursa (job #2514566)
#include <fstream>
#include <deque>
#include <climits>
#define MMAX 1005
#define NMAX 1005
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int m, n, p;
int dx, dy;
int a[NMAX][MMAX];
int minmat[NMAX][MMAX], maxmat[NMAX][MMAX];
int difmin=INT_MAX, nr;
struct el{
int i;
int j;
};
deque <int> minim;
deque <int> maxim;
deque <int> test;
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.front() == j-dy)
minim.pop_front();
while(!minim.empty() && a[i][minim.back()]>a[i][j])
minim.pop_back();
minim.push_back(j);
}
void adaug_in_minim_matnoua(int i, int j){
while(!minim.empty() && minim.front() == i-dx)
minim.pop_front();
while(!minim.empty() && a[minim.back()][minmat[minim.back()][j]]>a[i][minmat[i][j]])
minim.pop_back();
minim.push_back(i);
}
void adaug_in_maxim_matnoua(int i, int j){
while(!maxim.empty() && maxim.front() == i-dx)
maxim.pop_front();
while(!maxim.empty() && a[maxim.back()][maxmat[maxim.front()][j]]<a[i][maxmat[i][j]])
maxim.pop_back();
maxim.push_back(i);
}
void adaug_in_maxim(int i, int j){
while(!maxim.empty() && maxim.front() == j-dy)
maxim.pop_front();
while(!maxim.empty() && a[i][maxim.back()]<a[i][j])
maxim.pop_back();
maxim.push_back(j);
}
void zeroz(){
while(!minim.empty())
minim.pop_back();
while(!maxim.empty())
maxim.pop_back();
for(int i=0; i<n; i++)
for(int j=0; j<m-dy+1; j++){
minmat[i][j]=0;
maxmat[i][j]=0;
}
}
void solve(){ /// dx - linii dy - coloane
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){
minmat[i][j-dy+1] = minim.front();
maxmat[i][j-dy+1] = maxim.front();
}
}
while(!minim.empty())
minim.pop_back();
while(!maxim.empty())
maxim.pop_back();
}
for(int j=0; j<m-dy+1; j++){
for(int i=0; i<n; i++){
adaug_in_minim_matnoua(i, j);
adaug_in_maxim_matnoua(i, j);
if(i>=dx-1){
int dif = a[maxim.front()][maxmat[maxim.front()][j]] - a[minim.front()][minmat[minim.front()][j]];
if(dif<difmin){
difmin = dif;
nr=1;
}
else if(dif == difmin)
nr++;
}
}
//g<<'\n';
while(!minim.empty())
minim.pop_back();
while(!maxim.empty())
maxim.pop_back();
}
// for(int i=0; i<n; i++){
// for(int j=0; j<m-dy+1; j++){
// g<<minmat[i][j]<<" ";
// }
// g<<'\n';
// }
// g<<'\n';g<<'\n';
// for(int i=0; i<n; i++){
// for(int j=0; j<m-dy+1; j++){
// g<<maxmat[i][j]<<" ";
// }
// g<<'\n';
// }
//zeroz();
}
int main()
{
citire();
for(int i=0; i<p; i++){
f>>dx>>dy;
difmin = INT_MAX;
nr=0;
solve();
int aux = dx;
dx = dy;
dy = aux;
solve();
if(dx == dy)
nr/=2;
g<<difmin<<" "<<nr<<'\n';
}
return 0;
}