Pagini recente » Cod sursa (job #2752286) | Cod sursa (job #1471978) | Cod sursa (job #2558447) | Cod sursa (job #1552416) | Cod sursa (job #1492792)
#include <fstream>
using namespace std;
ifstream f("srtuti.in");
ofstream g("struti.out");
int N,M,nb;
int Matrix[1005][1005],P,ans,Max[1005][1005],Min[1005][1005],Begin[2][1005],End[2][1005],MMax[1005],MMin[1005],BeginMin=1,BeginMax=1,EndMax,EndMin;
void Read()
{
f>>N>>M>>P;
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
f>>Matrix[i][j],Begin[0][i]=Begin[1][i]=1;
}
void Update(int L,int C)
{
for(int i=1;i<=N;i++)
{
while(BeginMax<=EndMax && Matrix[i][Max[i][Begin[0][i]]]>=MMax[EndMax])
--EndMax;
MMax[++EndMax]=i;
if(BeginMax==i-L)
++BeginMax;
while(BeginMin<=EndMin && Matrix[i][Min[i][Begin[1][i]]]<=MMin[EndMin])
--EndMin;
MMax[++EndMin]=i;
if(BeginMin==i-L)
++BeginMin;
int line1=MMax[BeginMax],line2=MMin[BeginMin];
if(ans==Matrix[line1][Max[line1][Begin[0][line1]]]-Matrix[line2][Min[line2][Begin[1][line2]]])
++nb;
if(ans<Matrix[line1][Max[line1][Begin[0][line1]]]-Matrix[line2][Min[line2][Begin[1][line2]]])
{
ans=Matrix[line1][Max[line1][Begin[0][line1]]]-Matrix[line2][Min[line2][Begin[1][line2]]];
nb=1;
}
ans=max(ans,Matrix[line1][Max[line1][Begin[0][line1]]]-Matrix[line2][Min[line2][Begin[1][line2]]]);
}
}
void Solve(int L,int C)
{
for(int i=1;i<=N;i++)
{
for(int j=1;j<=C;j++)
{
while(Begin[0][i]<=End[0][i] && Matrix[i][j]>=Matrix[i][Max[i][End[0][i]]])
--End[0][i];
Max[i][++End[0][i]]=j;
while(Begin[1][i]<=End[1][i] && Matrix[i][j]<=Matrix[i][Min[i][End[1][i]]])
--End[0][i];
Min[i][++End[0][i]]=j;
}
}
Update(L,C);
for(int j=C+1;j<=M;j++)
{
for(int i=1;i<=N;i++)
{
while(Begin[0][i]<=End[0][i] && Matrix[i][j]>=Matrix[i][Max[i][End[0][i]]])
--End[0][i];
Max[i][++End[0][i]]=j;
if(Begin[0][i]==j-C)
++Begin[0][i];
while(Begin[1][i]<=End[1][i] && Matrix[i][j]<=Matrix[i][Min[i][End[1][i]]])
--End[0][i];
Min[i][++End[0][i]]=j;
if(Begin[1][i]==j-C)
++Begin[1][i];
}
Update(L,C);
}
g<<ans<<" "<<nb<<"\n";
}
int main()
{
Read();
for(int i=1;i<=P;i++)
{
int L,C;
f>>L>>C;
Solve(L,C);
ans=nb=0;
for(int i=1;i<=N;i++)
Begin[0][i]=Begin[1][i]=BeginMax=BeginMin=1,End[0][i]=End[1][i]=EndMin=EndMax=0;
}
return 0;
}