Pagini recente » Cod sursa (job #2215085) | Cod sursa (job #18574) | Cod sursa (job #104613) | Cod sursa (job #2852254) | Cod sursa (job #1073609)
#include <iostream>
#include <fstream>
#include <utility>
#include <deque>
using namespace std;
const int NMAX = 1001;
int m, n, p;
int mat[NMAX][NMAX];
int sol, nr;
void solve(int dx, int dy){
int i,j;
deque< pair<int, int> > demin, demax;
int maxim[NMAX][NMAX], minim[NMAX][NMAX];
for (i = 1; i <= m; ++i){
//pt fiecare coloana :>
for (j = 1; j < dx; ++j){
while (!demin.empty() && demin.back().second >= mat[j][i])
demin.pop_back();
demin.push_back(make_pair(j, mat[j][i]));
while (!demax.empty() && demax.back().second <= mat[j][i])
demax.pop_back();
demax.push_back(make_pair(j, mat[j][i]));
}
for (j = dx; j<=n; ++j){
while (!demin.empty() && demin.back().second >= mat[j][i])
demin.pop_back();
demin.push_back(make_pair(j, mat[j][i]));
while (!demax.empty() && demax.back().second <= mat[j][i])
demax.pop_back();
demax.push_back(make_pair(j, mat[j][i]));
if ( demin.front().first <= j-dx )
demin.pop_front();
if ( demax.front().first <= j-dx )
demax.pop_front();
minim[j][i] = demin.front().second;
maxim[j][i] = demax.front().second;
}
demin.clear();
demax.clear();
}
for(i = dx; i <= n; ++i){
for(j = 1; j < dy; ++j){
while (!demin.empty() && demin.back().second >= minim[i][j] )
demin.pop_back();
demin.push_back(make_pair(j, minim[i][j]));
while (!demax.empty() && demax.back().second <= maxim[i][j])
demax.pop_back();
demax.push_back(make_pair(j, maxim[i][j]));
}
for (j = dy; j<= m; ++j){
while (!demin.empty() && demin.back().second >= minim[i][j] )
demin.pop_back();
demin.push_back(make_pair(j, minim[i][j]));
while (!demax.empty() && demax.back().second <= maxim[i][j])
demax.pop_back();
demax.push_back(make_pair(j, maxim[i][j]));
if (demin.front().first <= j - dy )
demin.pop_front();
if (demax.front().first <= j - dy )
demax.pop_front();
minim[i][j] = demin.front().second;
maxim[i][j] = demax.front().second;
int dif = maxim[i][j] - minim[i][j];
if (dif < sol ){
sol = dif;
nr = 1;
}else if (dif == sol)
nr++;
}
demin.clear();
demax.clear();
}
}
int main(){
int i, j;
ifstream in("struti.in");
ofstream out("struti.out");
in>>n>>m>>p;
for (i = 1; i <= n; ++i)
for (j= 1; j<= m; ++j)
in>>mat[i][j];
for (i = 1; i<=p; ++i){
int dx, dy;
in>>dx>>dy;
nr = 0;
sol = 9000;
solve(dx, dy);
if (dx != dy) solve(dy,dx);
out<<sol<<" "<<nr<<"\n";
}
in.close();
out.close();
return 0;
}