Pagini recente » Cod sursa (job #2731774) | Cod sursa (job #1851992) | Cod sursa (job #1397757) | Cod sursa (job #311989) | Cod sursa (job #967852)
Cod sursa(job #967852)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int n,m,p,a[1005][1005],mn[1005][1005],mx[1005][1005],q[1005],sol1[1005][1005],sol2[1005][1005],maxx,ap=0;
void Read();
void Solve(int x,int y);
void Read()
{ int i,j,dim1,dim2;
f>>n>>m>>p;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
f>>a[i][j];
for(i=1;i<=p;i++)
{ f>>dim1>>dim2;
maxx=2147000000; ap=0;
Solve(dim1,dim2);
if (dim1!=dim2) Solve(dim2,dim1);
g<<maxx<<" "<<ap<<"\n";
}
}
void Solve(int x,int y)
{ int i,j,st=1,dr=0;
for(j=1;j<=m;j++)
{ st=1;dr=0; //memset(q,0,sizeof(q));
for(i=1;i<=n;i++)
{ while(st<=dr && a[i][j]<a[q[dr]][j]) dr--;
dr++; q[dr]=i;
while(q[st]<=i-x) st++;
mn[i][j]=a[q[st]][j];
}
}
for(j=1;j<=m;j++)
{ st=1;dr=0; //memset(q,0,sizeof(q));
for(i=1;i<=n;i++)
{ while(st<=dr && a[i][j]>a[q[dr]][j]) dr--;
dr++; q[dr]=i;
while(q[st]<=i-x) st++;
mx[i][j]=a[q[st]][j];
}
}
for(i=x;i<=n;i++)
{ st=1;dr=0; memset(q,0,sizeof(q));
for(j=1;j<=m;j++)
{while(st<=dr && mn[i][j]<mn[i][q[dr]]) dr--;
dr++; q[dr]=j;
while(q[st]<=j-y) st++;
sol1[i][j]=mn[i][q[st]];
}
}
for(i=x;i<=n;i++)
{ st=1;dr=0; memset(q,0,sizeof(q));
for(j=1;j<=m;j++)
{while(st<=dr && mx[i][j]>mx[i][q[dr]]) dr--;
dr++; q[dr]=j;
while(q[st]<=j-y) st++;
sol2[i][j]=mx[i][q[st]];
}
}
/*for(i=1;i<=n;i++)
{ for(j=1;j<=m;j++)
cout<<sol1[i][j]<<" ";
cout<<"\n";
}
cout<<"\n";
for(i=1;i<=n;i++)
{ for(j=1;j<=m;j++)
cout<<sol1[i][j]<<" ";
cout<<"\n";
}*/
for(i=x;i<=n;i++)
for(j=y;j<=m;j++)
if (sol2[i][j]-sol1[i][j]<maxx) {maxx=sol2[i][j]-sol1[i][j]; ap=1;}
else if (sol2[i][j]-sol1[i][j]==maxx) ap++;
}
int main()
{ Read();
return 0;
}