Pagini recente » Cod sursa (job #1350568) | Cod sursa (job #2984872) | Cod sursa (job #1424225) | Cod sursa (job #2839754) | Cod sursa (job #2732883)
#include <fstream>
#include <utility>
#include <climits>
#include <deque>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
const int N=1e3+2;
int m,n,p,rez,nr,i,j;
int v[N][N],mx[N][N],mn[N][N];
deque<int> hmin,hmax;
pair<int,int> oferta;
void deque_col(pair<int,int> of)
{
for(int j=1; j<=m; j++)
{
hmin.clear();
hmax.clear();
for(int i=1; i<=n; i++)
{
while(!hmax.empty() && v[i][j]>=v[hmax.back()][j])
hmax.pop_back();
while(!hmin.empty() && v[i][j]<=v[hmin.back()][j])
hmin.pop_back();
hmax.push_back(i);
hmin.push_back(i);
if(hmax.front()==i-of.first)
hmax.pop_front();
if(hmin.front()==i-of.first)
hmin.pop_front();
mx[i][j]=v[hmax.front()][j];
mn[i][j]=v[hmin.front()][j];
}
}
}
void deque_lin(pair<int,int> of)
{
for(int i=of.first; i<=n; i++)
{
hmin.clear();
hmax.clear();
for(int j=1; j<=m; j++)
{
while(!hmax.empty() && mx[i][j]>=mx[i][hmax.back()])
hmax.pop_back();
while(!hmin.empty() && mn[i][j]<=mn[i][hmin.back()])
hmin.pop_back();
hmax.push_back(j);
hmin.push_back(j);
if(hmax.front()==j-of.second)
hmax.pop_front();
if(hmin.front()==j-of.second)
hmin.pop_front();
if(j>=of.second && mx[i][hmax.front()]-mn[i][hmin.front()]<rez)
rez=mx[i][hmax.front()]-mn[i][hmin.front()], nr=1;
else if(j>=of.second && mx[i][hmax.front()]-mn[i][hmin.front()]==rez)
nr++;
}
}
}
int main()
{
fin>>n>>m>>p;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
fin>>v[i][j];
for(i=1; i<=p; i++)
{
rez=INT_MAX, nr=0;
fin>>oferta.first>>oferta.second;
deque_col(oferta);
deque_lin(oferta);
if(oferta.first!=oferta.second)
{
swap(oferta.first,oferta.second);
deque_col(oferta);
deque_lin(oferta);
}
fout<<rez<<' '<<nr<<'\n';
}
}