Pagini recente » Cod sursa (job #1255598) | Cod sursa (job #972417) | Cod sursa (job #2193724) | Cod sursa (job #426277) | Cod sursa (job #1068137)
#include<fstream>
#include<deque>
#define NMAX 1010
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int n, m, P, mn, nr, lung, lat, a[NMAX][NMAX];
deque<int> DMAX, DMIN, dmax[NMAX], dmin[NMAX];
void Citeste()
{
int i, j;
f>>n>>m>>P;
for (i=1; i<=n; ++i)
for (j=1; j<=m; ++j) f>>a[i][j];
}
void Initializeaza()
{
int i;
for (i=1; i<=n; ++i)
{
dmin[i].clear();
dmax[i].clear();
}
DMIN.clear();
DMAX.clear();
}
void Init()
{
int i, j;
for (i=1; i<=n; ++i)
for (j=1; j<lung; ++j)
{
//dmin
while (!dmin[i].empty() && a[i][dmin[i].back()]>a[i][j])
dmin[i].pop_back();
dmin[i].push_back(j);
//dmax
while (!dmax[i].empty() && a[i][dmax[i].back()]<a[i][j])
dmax[i].pop_back();
dmax[i].push_back(j);
}
}
void Solve()
{
int i, j, pmax, pmin, val;
for (j=lung; j<=m; ++j)
{
for (i=1; i<=n; ++i)
{
//dmin
while (!dmin[i].empty() && a[i][dmin[i].back()]>a[i][j]) dmin[i].pop_back();
if (!dmin[i].empty() && dmin[i].front()==j-lung) dmin[i].pop_front();
dmin[i].push_back(j);
//dmax
while (!dmax[i].empty() && a[i][dmax[i].back()]<a[i][j]) dmax[i].pop_back();
if (!dmax[i].empty() && dmax[i].front()==j-lung) dmax[i].pop_front();
dmax[i].push_back(j);
//solutie
pmax=dmax[i].front();
pmin=dmin[i].front();
while (!DMIN.empty() && a[DMIN.back()][dmin[DMIN.back()].front()]>a[i][pmin]) DMIN.pop_back();
if (i-lat>0 && !DMIN.empty() && DMIN.front()==i-lat) DMIN.pop_front();
DMIN.push_back(i);
while (!DMAX.empty() && a[DMAX.back()][dmax[DMAX.back()].front()]<a[i][pmax]) DMAX.pop_back();
if (i-lat>0 && !DMAX.empty() && DMAX.front()==i-lat) DMAX.pop_front();
DMAX.push_back(i);
if (i-lat>=0)
{
val=a[DMAX.front()][dmax[DMAX.front()].front()]-a[DMIN.front()][dmin[DMIN.front()].front()];
if (val<mn)
{
mn=val;
nr=1;
}
else
if (val==mn) ++nr;
}
}
DMIN.clear();
DMAX.clear();
}
}
int main()
{
Citeste();
while (P--)
{
f>>lat>>lung;
mn=NMAX*NMAX; nr=0;
Initializeaza();
Init();
Solve();
if (lung!=lat)
{
swap(lung, lat);
Initializeaza();
Init();
Solve();
}
g<<mn<<" "<<nr<<"\n";
}
f.close();
g.close();
return 0;
}