Pagini recente » Cod sursa (job #1072853) | Cod sursa (job #2871653) | Cod sursa (job #1086757) | Cod sursa (job #2043299) | Cod sursa (job #1106426)
#include<fstream>
#include<algorithm>
#include<string>
using namespace std;
const int NM = 1003;
const int INF = 0x3f3f3f3f;
int a[NM][NM],mx[NM][NM],mn[NM][NM],difmin,nr;
int dq[NM],dq2[NM],pq[NM],pq2[NM];
string s;
void deq(int DX,int DY,int N,int M){
int i,j,Front,F,Back,B;
for(i=1;i<=N;++i)
{
Front=1; Back=0;
F = 1; B = 0;
for(j=1;j<=M;++j)
{
for(;Front <= Back && dq[Back]<=a[i][j];--Back);
dq[++Back] = a[i][j]; pq[Back]=j;
for(;F <= B && dq2[B]>=a[i][j];--B);
dq2[++B] = a[i][j]; pq2[B]=j;
if(j - pq[Front] >= DX) ++Front;
if(j - pq2[F] >= DX) ++F;
if(j >= DX) mx[j][i]=dq[Front];
if(j >= DX) mn[j][i]=dq2[F];
}
}
for(i=DX;i<=M;++i)
{
Front=1; Back=0;
F = 1; B = 0;
for(j=1;j<=N;++j)
{
for(;Front <= Back && dq[Back]<=mx[i][j];--Back);
dq[++Back] = mx[i][j]; pq[Back]=j;
for(;F <= B && dq2[B]>=mn[i][j];--B);
dq2[++B] = mn[i][j]; pq2[B]=j;
if(j-pq[Front] >= DY) ++Front;
if(j-pq2[F] >= DY) ++F;
if(j >= DY)
{
if(dq[Front]-dq2[F] == difmin) ++nr;
else
if(dq[Front]-dq2[F] < difmin){ difmin=dq[Front]-dq2[F]; nr=1; }
}
}
}
}
int main(){
ifstream cin("struti.in");
ofstream cout("struti.out");
int N,M,P,i,j,k,x,l,DX,DY;
cin>>N>>M>>P; getline(cin,s);
for(i=1;i<=N;++i)
{
getline(cin,s); j=k=0; l=s.length();
while(j<l){
while(j<l && s[j]!=' '){ x=(x*10)+(s[j]-'0'); ++j; }
a[i][++k]=x; x=0; ++j;
}
}
while(P--){
cin>>DX>>DY;
difmin = INF; nr=0;
deq(DX,DY,N,M);
if(DX!=DY) deq(DY,DX,N,M);
cout<<difmin<<' '<<nr<<'\n';
}
return 0;
}