Pagini recente » Borderou de evaluare (job #2355780) | Borderou de evaluare (job #202394) | Cod sursa (job #2508659) | Borderou de evaluare (job #2688531) | Cod sursa (job #3183801)
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
#pragma GCC optimize("Ofast")
ifstream fin("struti.in");
ofstream fout("struti.out");
const int maxN = 1005;
int mat[maxN][maxN], amaxi[maxN][maxN], amini[maxN][maxN];
int n, m, t, val, nr;
deque <int> dqmax, dqmin;
void solve(int x, int y)
{
for(int j = 1; j <= m; j++)
{
dqmax.clear();
dqmin.clear();
for(int i = 1; i <= n; i++)
{
while(!dqmax.empty() && mat[i][j] >= mat[dqmax.back()][j])
dqmax.pop_back();
dqmax.push_back(i);
if(dqmax.front() == i - x)
dqmax.pop_front();
while(!dqmin.empty() && mat[i][j] <= mat[dqmin.back()][j])
dqmin.pop_back();
dqmin.push_back(i);
if(dqmin.front() == i - x)
dqmin.pop_front();
if(i >= x)
{
amaxi[i][j] = mat[dqmax.front()][j];
amini[i][j] = mat[dqmin.front()][j];
}
}
}
for(int i = x; i <= n; i++)
{
dqmax.clear();
dqmin.clear();
for(int j = 1; j <= m; j++)
{
while(!dqmax.empty() && amaxi[i][j] >= amaxi[i][dqmax.back()])
dqmax.pop_back();
dqmax.push_back(j);
if(dqmax.front() == j - y)
dqmax.pop_front();
while(!dqmin.empty() && amini[i][j] <= amini[i][dqmin.back()])
dqmin.pop_back();
dqmin.push_back(j);
if(dqmin.front() == j - y)
dqmin.pop_front();
int diff = amaxi[i][dqmax.front()] - amini[i][dqmin.front()];
if(j >= y)
{
if(diff == val)
nr++;
if(diff < val)
{
val = diff;
nr = 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++)
{
int a, b;
fin >> a >> b;
val = 0x3f3f3f3f;
nr = 0;
solve(a, b);
if(b != a)
solve(b, a);
fout << val << ' ' << nr << '\n';
}
return 0;
}