Pagini recente » Cod sursa (job #499805) | Cod sursa (job #1202245) | Cod sursa (job #2557442) | Cod sursa (job #2607259) | Cod sursa (job #2592811)
#include <bits/stdc++.h>
#define inf 1000000005
using namespace std;
ifstream in("struti.in");
ofstream out("struti.out");
deque<int> dmax,dmin;
int n,m,a[1005][1005],p,maxim[1005][1005],sol=inf,cr,minim[1005][1005],smax[1005],smin[1005];
vector<int> get(vector<int> v, int n, int k)
{
int i;
dmax.clear();
dmin.clear();
for (i = 1; i <= n; i++) {
///maxim
while (!dmax.empty() && v[i] >= v[dmax.back()])
dmax.pop_back();
dmax.push_back(i);
while (dmax.front() < i - k + 1)
dmax.pop_front();
smax[i] = v[dmax.front()];
///minim
while (!dmin.empty() && v[i] <= v[dmin.back()])
dmin.pop_back();
dmin.push_back(i);
while (dmin.front() < i - k + 1)
dmin.pop_front();
smin[i] = v[dmin.front()];
}
}
int solve(int y, int x)
{int i,j,cost,sol_max[1005],sol_min[1005];
vector<int> v,s[2];
//cout << "k = " << y << "\n";
for (j = 1; j <= m; j++) {
v.clear();
v.resize(n + 1);
for (i = 1; i <= n; i++)
v[i] = a[i][j];
get(v , n , y);
for (i = 1; i <= n; i++) {
maxim[i][j] = smax[i];
minim[i][j] = smin[i];
}
}
for (i = y; i <= n; i++) {
v.clear();
v.resize(m + 1);
for (j = 1; j <= m; j++)
v[j] = maxim[i][j];
get(v , m , x);
for (j = 1; j <= m; j++)
sol_max[j] = smax[j];
for (j = 1; j <= m; j++)
v[j] = minim[i][j];
get(v , m , x);
for (j = 1; j <= m; j++)
sol_min[j] = smin[j];
for (j = x; j <= m; j++)
{
cost = sol_max[j] - sol_min[j];
if (cost < sol) sol = cost, cr = 1;
else if(cost == sol) cr++;
}
}
}
int main()
{int i,j,dx,dy,p1,p2;
in >> n >> m >> p;
for (i = 1; i <= n; i++) for (j = 1; j <= m; j++) in >> a[i][j];
for (i = 1; i <= p; i++)
{
in >> dx >> dy;
sol = inf;
solve(dy , dx);
if (dx != dy)
solve(dx , dy);
out << sol << " " << cr << "\n";
}
}