Pagini recente » Cod sursa (job #2147902) | Cod sursa (job #3000248) | Cod sursa (job #3264322) | Cod sursa (job #802985) | Cod sursa (job #3234933)
#include <bits/stdc++.h>
#include<deque>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int ma[1005][1005],fr[10000],final_min[1005][1005],final_max[1005][1005],N,M;
int l1=0,c1;
void DQ_min(int l,int c)
{
deque<int> dq;
for(int i=0;i<N;i++)
{
c1=0;
for(int j=0;j<M;j++)
{
while(dq.empty()==0 && ma[i][j]<ma[i][dq.back()])
{
dq.pop_back();
}
dq.push_back(j);
if(dq.empty()==0 && dq.front()<=j-c)
{
dq.pop_front();
}
if(j>=c-1)
{
final_min[i][c1]=ma[i][dq.front()];
c1++;
}
}
dq.clear();
}
dq.clear();
for(int j=0;j<c1;j++)
{
l1=0;
for(int i=0;i<N;i++)
{
while(dq.empty()==0 && final_min[i][j]<final_min[dq.back()][j])
{
dq.pop_back();
}
dq.push_back(i);
if(dq.empty()==0 && dq.front()<=i-l)
{
dq.pop_front();
}
if(i>=l-1)
{
final_min[l1][j]=final_min[dq.front()][j];
l1++;
}
}
dq.clear();
}
}
void DQ_max(int l,int c)
{
int l2=0,c2=0;
deque<int> dq;
for(int i=0;i<N;i++)
{
c2=0;
for(int j=0;j<M;j++)
{
while(dq.empty()==0 && ma[i][j]>ma[i][dq.back()])
{
dq.pop_back();
}
dq.push_back(j);
if(dq.empty()==0 && dq.front()<=j-c)
{
dq.pop_front();
}
if(j>=c-1)
{
final_max[i][c2]=ma[i][dq.front()];
c2++;
}
}
dq.clear();
}
dq.clear();
for(int j=0;j<c2;j++)
{
l2=0;
for(int i=0;i<N;i++)
{
while(dq.empty()==0 && final_max[i][j]>final_max[dq.back()][j])
{
dq.pop_back();
}
dq.push_back(i);
if(dq.empty()==0 && dq.front()<=i-l)
{
dq.pop_front();
}
if(i>=l-1)
{
final_max[l2][j]=final_max[dq.front()][j];
l2++;
}
}
dq.clear();
}
}
int main()
{
int P,DX,DY;
fin>>N>>M>>P;
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
fin>>ma[i][j];
}
}
while(P--)
{
fin>>DX>>DY;
short int ok=0;
int cnt=0,mini=8005;
while(ok<2)
{
if(ok==1)
{
swap(DX,DY);
}
DQ_min(DX,DY);
DQ_max(DX,DY);
for(int x=0;x<l1;x++)
{
for(int y=0;y<c1;y++)
{
if(final_max[x][y]-final_min[x][y]<mini)
{
mini=final_max[x][y]-final_min[x][y];
cnt=1;
}
else if(final_max[x][y]-final_min[x][y]==mini)
{
cnt++;
}
}
}
ok++;
if(DX==DY)
{
break;
}
}
fout<<mini<<' '<<cnt<<endl;
}
return 0;
}