Pagini recente » Borderou de evaluare (job #593037) | Cod sursa (job #3198596) | Borderou de evaluare (job #1989507) | tradare | Cod sursa (job #3353355)
#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
int n, m;
int v[N][N], x[N][N], dif[N][N];
int ans1, ans2;
void solve(int dx, int dy)
{
deque <int> dq;
for(int j = 0; j < m; j++)
{
dq.clear();
for(int i = 0; i < n; i++)
{
dif[i][j] = 0;
while(!dq.empty() && v[i][j] >= v[dq.back()][j])
{
dq.pop_back();
}
dq.push_back(i);
if(dq.front() < i - dx + 1)
dq.pop_front();
if(i >= dx - 1)
{
x[i][j] = v[dq.front()][j];
}
}
}
for(int i = 0; i < n; i++)
{
dq.clear();
for(int j = 0; j < m; j++)
{
while(!dq.empty() && x[i][j] >= x[i][dq.back()])
{
dq.pop_back();
}
dq.push_back(j);
if(dq.front() < j - dy + 1)
dq.pop_front();
if(j >= dy - 1)
{
dif[i][j] += x[i][dq.front()];
}
}
}
for(int j = 0; j < m; j++)
{
dq.clear();
for(int i = 0; i < n; i++)
{
while(!dq.empty() && v[i][j] <= v[dq.back()][j])
{
dq.pop_back();
}
dq.push_back(i);
if(dq.front() < i - dx + 1)
dq.pop_front();
if(i >= dx - 1)
{
x[i][j] = v[dq.front()][j];
}
}
}
for(int i = 0; i < n; i++)
{
dq.clear();
for(int j = 0; j < m; j++)
{
while(!dq.empty() && x[i][j] <= x[i][dq.back()])
{
dq.pop_back();
}
dq.push_back(j);
if(dq.front() < j - dy + 1)
dq.pop_front();
if(j >= dy - 1)
{
dif[i][j] -= x[i][dq.front()];
}
}
}
for(int i = dx - 1; i < n; i++)
{
for(int j = dy - 1; j < m; j++)
{
if(dif[i][j] < ans1)
{
ans1 = dif[i][j];
ans2 = 1;
}
else if(dif[i][j] == ans1)
{
ans2++;
}
}
}
}
int main()
{
ifstream cin("struti.in");
ofstream cout("struti.out");
int i, j, p, dx, dy;
cin >> n >> m >> p;
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
{
cin >> v[i][j];
}
}
for(i = 0; i < p; i++)
{
cin >> dx >> dy;
ans1 = INT_MAX;
ans2 = 0;
solve(dx, dy);
if(dy != dx)
solve(dy, dx);
cout << ans1 << " " << ans2 << "\n";
}
return 0;
}