Pagini recente » Cod sursa (job #1509414) | Cod sursa (job #854089) | Monitorul de evaluare | Cod sursa (job #822912) | Cod sursa (job #2040883)
#include <iostream>
#include <cstdio>
#include <deque>
using namespace std;
int m,n,p,mCit[1005][1005],mMin[1005][1005],mMax[1005][1005];
pair<int,int> teste[15];
deque<int> ptMin,ptMax;
int solMIN,solNR;
void citire()
{
int aux1,aux2;
scanf("%d%d%d",&m,&n,&p);
for(int i=1; i<=m; i++)
for(int j=1; j<=n; j++)
scanf("%d",&mCit[i][j]);
for(int i=1; i<=p; i++)
{
scanf("%d%d",&aux1,&aux2);
teste[i].first=aux1;
teste[i].second=aux2;
}
}
void solver(int x,int y)
{
for(int i=1; i<=m; i++)
{
ptMin.erase(ptMin.begin(),ptMin.end());
ptMax.erase(ptMax.begin(),ptMax.end());
for(int j=1; j<=n; j++)
{
while(!ptMin.empty()&&mCit[i][ptMin.back()]>=mCit[i][j])
ptMin.pop_back();
while(!ptMax.empty()&&mCit[i][ptMax.back()]<=mCit[i][j])
ptMax.pop_back();
ptMin.push_back(j);
ptMax.push_back(j);
if(j-ptMin.front()+1>y)
ptMin.pop_front();
if(j-ptMax.front()+1>y)
ptMax.pop_front();
if(j>=y)
{
mMin[i][j-y+1]=mCit[i][ptMin.front()];
mMax[i][j-y+1]=mCit[i][ptMax.front()];
}
}
}
for(int j=1; j<=n-y+1; j++)
{
ptMin.erase(ptMin.begin(),ptMin.end());
ptMax.erase(ptMax.begin(),ptMax.end());
for(int i=1; i<=m; i++)
{
while(!ptMin.empty()&&mMin[ptMin.back()][j]>=mMin[i][j])
ptMin.pop_back();
while(!ptMax.empty()&&mMax[ptMax.back()][j]<=mMax[i][j])
ptMax.pop_back();
ptMin.push_back(i);
ptMax.push_back(i);
if(i-ptMin.front()+1>x)
ptMin.pop_front();
if(i-ptMax.front()+1>x)
ptMax.pop_front();
if(i>=x)
{
if(mMax[ptMax.front()][j]-mMin[ptMin.front()][j]==solMIN)
{
solNR++;
}
if(mMax[ptMax.front()][j]-mMin[ptMin.front()][j]<solMIN)
{
solMIN=mMax[ptMax.front()][j]-mMin[ptMin.front()][j];
solNR=1;
}
}
}
}
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
citire();
for(int i=1; i<=p; i++)
{
solMIN=0x3f3f3f,solNR=0;
solver(teste[i].first,teste[i].second);
if(teste[i].first!=teste[i].second)
solver(teste[i].second,teste[i].first);
printf("%d %d\n",solMIN,solNR);
}
return 0;
}