Pagini recente » Cod sursa (job #3265136) | Cod sursa (job #3197031) | Cod sursa (job #3268617) | Cod sursa (job #1249499) | Cod sursa (job #3239272)
#include <fstream>
#include <deque>
using namespace std;
ifstream cin("struti.in");
ofstream cout("struti.out");
deque<int>q1,q2;
int v[1005][1005];
int matmax1[1005][1005], matmin1[1005][1005],matmax2[1005][1005],matmin2[1005][1005];
int max1[1005][1005],min1[1005][1005],max2[1005][1005],min2[1005][1005];
int n,m,k;
void calc(int x, int y, int minn[][1005], int maxx[][1005], int MINN[][1005], int MAXX[][1005])
{
for(int i=1; i<=n; i++)
{
while(!q1.empty())
q1.pop_back();
while(!q2.empty())
q2.pop_back();
for(int j=1; j<=m; j++)
{
while(!q1.empty() && v[i][j]<v[i][q1.back()])
q1.pop_back();
q1.push_back(j);
while(!q1.empty() && j-q1.front()>=x)
q1.pop_front();
while(!q2.empty() && v[i][j]>v[i][q2.back()])
q2.pop_back();
q2.push_back(j);
while(!q2.empty() && j-q2.front()>=x)
q2.pop_front();
if(j>=x)
{
maxx[i][j-x+1]=v[i][q2.front()];
minn[i][j-x+1]=v[i][q1.front()];
}
}
}
for(int j=1; j<=m-x+1; j++)
{
while(!q1.empty())
q1.pop_back();
while(!q2.empty())
q2.pop_back();
for(int i=1; i<=n; i++)
{
while(!q1.empty() && minn[i][j]<minn[q1.back()][j])
q1.pop_back();
q1.push_back(i);
while(!q1.empty() && i-q1.front()>=y)
q1.pop_front();
while(!q2.empty() && maxx[i][j]>maxx[q2.back()][j])
q2.pop_back();
q2.push_back(i);
while(!q2.empty() && i-q2.front()>=y)
q2.pop_front();
if(i>=y)
{
MAXX[i-y+1][j]=maxx[q2.front()][j];
MINN[i-y+1][j]=minn[q1.front()][j];
}
}
}
}
int main()
{
cin>>n>>m>>k;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
cin>>v[i][j];
int dx,dy;
while(k>0)
{
cin>>dx>>dy;
calc(dx,dy,matmin1,matmax1,min1,max1);
calc(dy,dx,matmin2,matmax2,min2,max2);
// for(int i=1; i<=n; i++)
// {
// for(int j=1; j<=m-dx+1; j++)
// cout<<matmin1[i][j]<<" ";
// cout<<'\n';
// }
// for(int i=1; i<=n-dy+1; i++)
// {
// for(int j=1; j<=m-dx+1; j++)
// cout<<min1[i][j]<<" ";
// cout<<'\n';
// }
int mindif=2100000000,cnt=0;
for(int i=1; i<=n-dy+1; i++)
for(int j=1; j<=m-dx+1; j++)
{
if(max1[i][j]-min1[i][j]<mindif)
mindif=max1[i][j]-min1[i][j], cnt=1;
else if(max1[i][j]-min1[i][j]==mindif)
cnt++;
}
for(int i=1; i<=n-dx+1; i++)
for(int j=1; j<=m-dy+1; j++)
{
if(max2[i][j]-min2[i][j]<mindif)
mindif=max2[i][j]-min2[i][j], cnt=1;
else if(max2[i][j]-min2[i][j]==mindif)
cnt++;
}
if(dx==dy)
cnt/=2;
cout<<mindif<<" "<<cnt<<'\n';
k--;
}
return 0;
}