Pagini recente » Cod sursa (job #1538263) | Cod sursa (job #1138209) | Profil M.Madalina | Cod sursa (job #2931468) | Cod sursa (job #2790385)
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
const int maxN = 1000;
int n, m, t, mat[maxN + 5][maxN + 5], a, b, ans = 0x3f3f3f3f, nr_ans;
deque <int> dqmax, dqmin, dqmaxi[maxN + 5], dqmini[maxN + 5];
void solve(int x, int y)
{
for(int i = 1; i <= m; i++)
{
while(!dqmax.empty())
dqmax.pop_back();
while(!dqmin.empty())
dqmin.pop_back();
for(int j = 1; j <= n; j++)
{
while(!dqmaxi[j].empty() && mat[j][dqmaxi[j].back()] < mat[j][i])
dqmaxi[j].pop_back();
dqmaxi[j].push_back(i);
if(dqmaxi[j].front() <= i - x)
dqmaxi[j].pop_front();
while(!dqmini[j].empty() && mat[j][dqmini[j].back()] > mat[j][i])
dqmini[j].pop_back();
dqmini[j].push_back(i);
if(dqmini[j].front() <= i - x)
dqmini[j].pop_front();
while(!dqmax.empty() && mat[dqmax.back()][dqmaxi[dqmax.back()].front()] < mat[j][dqmaxi[j].front()])
dqmax.pop_back();
dqmax.push_back(j);
if(dqmax.front() <= j - y)
dqmax.pop_front();
while(!dqmin.empty() && mat[dqmin.back()][dqmini[dqmin.back()].front()] > mat[j][dqmini[j].front()])
dqmin.pop_back();
dqmin.push_back(j);
if(dqmin.front() <= j - y)
dqmin.pop_front();
int val = mat[dqmax.front()][dqmaxi[dqmax.front()].front()] - mat[dqmin.front()][dqmini[dqmin.front()].front()];
if(j >= y && i >= x)
{
if(val == ans)
nr_ans++;
if(val < ans)
{
ans = val;
nr_ans = 1;
}
}
/// fout << i << ' ' << j << " " << dqmaxi[dqmax.front()].front() << ' ' << dqmax.front() << " " << dqmini[dqmin.front()].front() << ' ' << dqmin.front() << " " << val << '\n';
}
}
}
int main()
{
ios::sync_with_stdio(false);
fin >> n >> m >> t;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
fin >> mat[i][j];
for(int i = 1; i <= t; i++)
{
fin >> a >> b;
for(int j = 1; j <= n; j++)
{
while(!dqmaxi[j].empty())
dqmaxi[j].pop_back();
while(!dqmini[j].empty())
dqmini[j].pop_back();
}
solve(a, b);
if(b != a)
{
for(int j = 1; j <= n; j++)
{
while(!dqmaxi[j].empty())
dqmaxi[j].pop_back();
while(!dqmini[j].empty())
dqmini[j].pop_back();
}
solve(b, a);
}
fout << ans << ' ' << nr_ans << '\n';
ans = 0x3f3f3f3f;
nr_ans = 0;
}
return 0;
}