Pagini recente » Cod sursa (job #1491813) | Cod sursa (job #2467203) | Cod sursa (job #3292106) | Cod sursa (job #1857521) | Cod sursa (job #3292075)
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
const int MAX=1000;
int n,m,v[MAX+5][MAX+5],i,j,dx,dy,p,mx[MAX+5][MAX+5],mn[MAX+5][MAX+5],cnt,minim;
deque <int> dq,dq2;
void task(int dx, int dy)
{
for (i=1; i<=n; i++)
{
for (j=1; j<=dy; j++)
{
while (!dq.empty() && v[i][j]>v[i][dq.back()])
dq.pop_back();
dq.push_back(j);
}
mx[i][dy]=v[i][dq.front()];
for (j=dy+1; j<=m; j++)
{
while (!dq.empty() && dq.front()<=j-dy)
dq.pop_front();
while (!dq.empty() && v[i][j]>v[i][dq.back()])
dq.pop_back();
dq.push_back(j);
mx[i][j]=v[i][dq.front()];
}
while (!dq.empty())
dq.pop_back();
}
for (i=1; i<=n; i++)
{
for (j=1; j<=dy; j++)
{
while (!dq.empty() && v[i][j]<v[i][dq.back()])
dq.pop_back();
dq.push_back(j);
}
mn[i][dy]=v[i][dq.front()];
for (j=dy+1; j<=m; j++)
{
while (!dq.empty() && dq.front()<=j-dy)
dq.pop_front();
while (!dq.empty() && v[i][j]<v[i][dq.back()])
dq.pop_back();
dq.push_back(j);
mn[i][j]=v[i][dq.front()];
}
while (!dq.empty())
dq.pop_back();
}
for (j=dy; j<=m; j++)
{
for (i=1; i<=dx; i++)
{
while (!dq.empty() && mx[i][j]>mx[dq.back()][j])
dq.pop_back();
while (!dq2.empty() && mn[i][j]<mn[dq2.back()][j])
dq2.pop_back();
dq.push_back(i);
dq2.push_back(i);
}
if (mx[dq.front()][j]-mn[dq2.front()][j]<minim)
{
minim=mx[dq.front()][j]-mn[dq2.front()][j];
cnt=1;
}
else if (mx[dq.front()][j]-mn[dq2.front()][j]==minim)
cnt++;
for (i=dx+1; i<=n; i++)
{
while (!dq.empty() && dq.front()<=i-dx)
dq.pop_front();
while (!dq2.empty() && dq2.front()<=i-dx)
dq2.pop_front();
while (!dq.empty() && mx[i][j]>mx[dq.back()][j])
dq.pop_back();
while (!dq2.empty() && mn[i][j]<mn[dq2.back()][j])
dq2.pop_back();
dq.push_back(i);
dq2.push_back(i);
if (mx[dq.front()][j]-mn[dq2.front()][j]<minim)
{
minim=mx[dq.front()][j]-mn[dq2.front()][j];
cnt=1;
}
else if (mx[dq.front()][j]-mn[dq2.front()][j]==minim)
cnt++;
}
while (!dq.empty())
dq.pop_back();
while (!dq2.empty())
dq2.pop_back();
}
}
int main()
{
fin>>n>>m>>p;
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
fin>>v[i][j];
while (p)
{
fin>>dx>>dy;
cnt=0;
minim=1e9;
task(dx,dy);
if (dx!=dy)
task(dy,dx);
fout<<minim<<" "<<cnt<<"\n";
p--;
}
return 0;
}