Pagini recente » Cod sursa (job #772054) | Cod sursa (job #1504503) | Cod sursa (job #195866) | Cod sursa (job #1813073) | Cod sursa (job #3315240)
#include <bits/stdc++.h>
#define NMAX 1001
#define VMAX 8001
using namespace std;
ifstream in("struti.in");
ofstream out("struti.out");
int n, m;
int h[NMAX][NMAX];
int minim=VMAX, nr=0; ///diferenta de altitudine minima si numarul de terenuri cu aceasta diferenta minima
int maxime[NMAX][NMAX], minime[NMAX][NMAX]; ///maximele si minimele subsecventelor de lungime col de pe fiecare linie
void dif_min(int lin, int col) ///diferenta de altitudine minima dintre toate dreptunghiurile cu lungimile laturilor lin si col
{
for(int i=1; i<=n; i++) ///calculam minimele si maximele pe subsecvente de lungime col pe fiecare linie
{
deque<int> dq_min, dq_max;
for(int j=1; j<=m; j++)
{
while(!dq_min.empty() && h[i][j]<h[i][dq_min.back()]) ///minime
dq_min.pop_back();
dq_min.push_back(j);
if(j-dq_min.front()>=col) dq_min.pop_front();
minime[i][j]=h[i][dq_min.front()];
while(!dq_max.empty() && h[i][j]>h[i][dq_max.back()]) ///maxime
dq_max.pop_back();
dq_max.push_back(j);
if(j-dq_max.front()>=col) dq_max.pop_front();
maxime[i][j]=h[i][dq_max.front()];
}
}
for(int j=col; j<=m; j++)
{
deque<int> dq_min, dq_max; ///minimele si maximele pe coloane
for(int i=1; i<=n; i++)
{
while(!dq_min.empty() && minime[i][j]<minime[dq_min.back()][j]) ///minime
dq_min.pop_back();
dq_min.push_back(i);
if(i-dq_min.front()>=lin) dq_min.pop_front();
while(!dq_max.empty() && maxime[i][j]>maxime[dq_max.back()][j]) ///maxime
dq_max.pop_back();
dq_max.push_back(i);
if(i-dq_max.front()>=lin) dq_max.pop_front();
if(i>=lin)
{
if(maxime[dq_max.front()][j]-minime[dq_min.front()][j]<minim)
{
minim=maxime[dq_max.front()][j]-minime[dq_min.front()][j];
nr=1;
}
else if(maxime[dq_max.front()][j]-minime[dq_min.front()][j]==minim)
{
nr++;
}
}
}
}
}
int main()
{
int p;
in >> n >> m >> p;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
in >> h[i][j];
}
while(p--)
{
int dx, dy;
in >> dx >> dy;
dif_min(dx, dy);
if(dx!=dy) dif_min(dy, dx);
out << minim << " " << nr << "\n";
minim=VMAX; nr=0;
}
return 0;
}