Pagini recente » Cod sursa (job #1794216) | Cod sursa (job #3153772) | Cod sursa (job #126908) | Cod sursa (job #2267880) | Cod sursa (job #1772204)
#include <bits/stdc++.h>
#define Nmax 1005
using namespace std;
int n, m, a[Nmax][Nmax];
deque<int> qmin[Nmax], qmax[Nmax];
deque<pair <int , int> > dmin, dmax;
void Rezolv(int dx, int dy, int &difmin, int &cnt)
{
int L, C, x, i, j;
L = dx;
C = dy;
for(j = 1; j <= C; j++)
{
for(i = 1; i <= n; i++)
{
x = a[i][j];
while(!qmax[i].empty() && x >= a[i][qmax[i].back()])
qmax[i].pop_back();
qmax[i].push_back(j);
while(!qmin[i].empty() && x <= a[i][qmin[i].back()])
qmin[i].pop_back();
qmin[i].push_back(j);
}
}
for(i = 1; i <= L; i++)
{
x = a[i][qmax[i].front()];
while(!dmax.empty() && x >= dmax.back().second)
dmax.pop_back();
dmax.push_back(make_pair(i, x));
x = a[i][qmin[i].front()];
while(!dmin.empty() && x <= dmin.back().second)
dmin.pop_back();
dmin.push_back(make_pair(i, x));
}
difmin = dmax.front().second - dmin.front().second;
cnt = 1;
for(i = L + 1; i <= n; i++)
{
x = a[i][qmax[i].front()];
while(!dmax.empty() && x >= dmax.back().second)
dmax.pop_back();
dmax.push_back(make_pair(i, x));
x = a[i][qmin[i].front()];
while(!dmin.empty() && x <= dmin.back().second)
dmin.pop_back();
dmin.push_back(make_pair(i, x));
if(i - dmax.front().first >= L)
dmax.pop_front();
if(i - dmin.front().first >= L)
dmin.pop_front();
x = dmax.front().second - dmin.front().second;
if(difmin > x)
{
difmin = x;
cnt = 1;
}
else if(difmin == x)
cnt++;
}
for(j = C + 1; j <= m; j++)
{
for(i = 1; i <= n; i++)
{
x = a[i][j];
while(!qmax[i].empty() && x >= a[i][qmax[i].back()])
qmax[i].pop_back();
qmax[i].push_back(j);
if(j - qmax[i].front() >= C)
qmax[i].pop_front();
while(!qmin[i].empty() && x <= a[i][qmin[i].back()])
qmin[i].pop_back();
qmin[i].push_back(j);
if(j - qmin[i].front() >= C)
qmin[i].pop_front();
}
dmax.clear();
dmin.clear();
for(i = 1; i <= L; i++)
{
x = a[i][qmax[i].front()];
while(!dmax.empty() && x >= dmax.back().second)
dmax.pop_back();
dmax.push_back(make_pair(i, x));
x = a[i][qmin[i].front()];
while(!dmin.empty() && x <= dmin.back().second)
dmin.pop_back();
dmin.push_back(make_pair(i, x));
}
for(i = L + 1; i <= n; i++)
{
x = a[i][qmax[i].front()];
while(!dmax.empty() && x >= dmax.back().second)
dmax.pop_back();
dmax.push_back(make_pair(i, x));
x = a[i][qmin[i].front()];
while(!dmin.empty() && x <= dmin.back().second)
dmin.pop_back();
dmin.push_back(make_pair(i, x));
if(i - dmax.front().first >= L)
dmax.pop_front();
if(i - dmin.front().first >= L)
dmin.pop_front();
x = dmax.front().second - dmin.front().second;
cout << dmax.front().second << " " << dmin.front().second << "\n";
if(difmin > x)
{
difmin = x;
cnt = 1;
}
else if(difmin == x)
cnt++;
}
}
}
void Citire()
{
ifstream f("struti.in");
ofstream g("struti.out");
int i, j, p, dx, dy, difmin, cnt;
f >> n >> m >> p;
for(i = 1; i <= n; i++)
for(j = 1; j <= m; j++)
f >> a[i][j];
for(i = 1; i <= p; i++)
{
f >> dx >> dy;
Rezolv(dx, dy, difmin, cnt);
g << difmin << " " << cnt << "\n";
}
f.close();
g.close();
}
int main()
{
Citire();
return 0;
}