Pagini recente » Cod sursa (job #1246960) | Cod sursa (job #2222262) | Cod sursa (job #9925) | Cod sursa (job #813712) | Cod sursa (job #2801477)
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
#pragma GCC optimize("Ofast")
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, vx[maxN + 5], vi[maxN + 5];
deque <int> dqmax, dqmin, dqmaxi[maxN + 5], dqmini[maxN + 5];
void solve(int x, int y)
{
for(int i = 1; i <= n; i++)
{
dqmax.clear();
dqmin.clear();
for(int j = 1; j <= m; j++)
{
while(!dqmaxi[j].empty() && mat[dqmaxi[j].back()][j] < mat[i][j])
dqmaxi[j].pop_back();
dqmaxi[j].push_back(i);
if(dqmaxi[j].front() <= i - x)
dqmaxi[j].pop_front();
vx[j] = dqmaxi[j].front();
while(!dqmini[j].empty() && mat[dqmini[j].back()][j] > mat[i][j])
dqmini[j].pop_back();
dqmini[j].push_back(i);
if(dqmini[j].front() <= i - x)
dqmini[j].pop_front();
vi[j] = dqmini[j].front();
while(!dqmax.empty() && mat[vx[dqmax.back()]][dqmax.back()] < mat[vx[j]][j])
dqmax.pop_back();
dqmax.push_back(j);
if(dqmax.front() <= j - y)
dqmax.pop_front();
while(!dqmin.empty() && mat[vi[dqmin.back()]][dqmin.back()] > mat[vi[j]][j])
dqmin.pop_back();
dqmin.push_back(j);
if(dqmin.front() <= j - y)
dqmin.pop_front();
int val = mat[vx[dqmax.front()]][dqmax.front()] - mat[vi[dqmin.front()]][dqmin.front()];
if(j >= y && i >= x)
{
if(val == ans)
nr_ans++;
if(val < ans)
{
ans = val;
nr_ans = 1;
}
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
fin.tie(0);
fout.tie(0);
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 <= m; j++)
{
dqmaxi[j].clear();
dqmini[j].clear();
}
solve(a, b);
if(b != a)
{
for(int j = 1; j <= m; j++)
{
dqmaxi[j].clear();
dqmini[j].clear();
}
solve(b, a);
}
fout << ans << ' ' << nr_ans << '\n';
ans = 0x3f3f3f3f;
nr_ans = 0;
}
return 0;
}