Pagini recente » Cod sursa (job #1858058) | Cod sursa (job #682911) | Cod sursa (job #3347317) | Cod sursa (job #3306319) | Cod sursa (job #3306303)
#include <bits/stdc++.h>
using namespace std;
int v[1005][1005];
int mn[1005][1005];
int mx[1005][1005];
deque <int> qn;
deque <int> qm;
int main()
{
ifstream cin("struti.in");
ofstream cout("struti.out");
int n,m,t,x,y;
cin>>n>>m>>t;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
cin>>v[i][j];
}
}
for(int h=1;h<=t;++h)
{
cin>>x>>y;
int min=INT_MAX,cnt=0;
for(int j=1;j<=m;++j)
{
while(qn.size())
{
qn.pop_front(); ///min
}
while(qm.size())
{
qm.pop_front(); ///max
}
for(int i=1;i<=n;++i)
{
while(qn.size()>0 && qn.front()<(i-x+1))
{
qn.pop_front();
}
while(qn.size()>0 && v[qn.back()][j]>=v[i][j])
{
qn.pop_back();
}
qn.push_back(i);
while(qm.size()>0 && qm.front()<(i-x+1))
{
qm.pop_front();
}
while(qm.size()>0 && v[qm.back()][j]<=v[i][j])
{
qm.pop_back();
}
qm.push_back(i);
mn[i][j]=v[qn.front()][j];
mx[i][j]=v[qm.front()][j];
}
}
for(int i=x;i<=n;++i)
{
while(qn.size())
{
qn.pop_front(); ///min
}
while(qm.size())
{
qm.pop_front(); ///max
}
for(int j=1;j<=m;++j)
{
while(qn.size()>0 && qn.front()<(j-y+1))
{
qn.pop_front();
}
while(qn.size()>0 && mn[i][qn.back()]>=mn[i][j])
{
qn.pop_back();
}
qn.push_back(j);
while(qm.size()>0 && qm.front()<(j-y+1))
{
qm.pop_front();
}
while(qm.size()>0 && mx[i][qm.back()]<=mx[i][j])
{
qm.pop_back();
}
qm.push_back(j);
if(j>=y)
{
//cout<<i<<" "<<j<<" "<<mx[i][qm.front()]<<" "<<mn[i][qn.front()]<<"\n";
if(mx[i][qm.front()]-mn[i][qn.front()]<min)
{
min=mx[i][qm.front()]-mn[i][qn.front()];
cnt=0;
}
if(mx[i][qm.front()]-mn[i][qn.front()]==min)
{
++cnt;
}
}
}
}
if(x!=y)
{
swap(x,y);
for(int j=1;j<=m;++j)
{
while(qn.size())
{
qn.pop_front(); ///min
}
while(qm.size())
{
qm.pop_front(); ///max
}
for(int i=1;i<=n;++i)
{
while(qn.size()>0 && qn.front()<(i-x+1))
{
qn.pop_front();
}
while(qn.size()>0 && v[qn.back()][j]>=v[i][j])
{
qn.pop_back();
}
qn.push_back(i);
while(qm.size()>0 && qm.front()<(i-x+1))
{
qm.pop_front();
}
while(qm.size()>0 && v[qm.back()][j]<=v[i][j])
{
qm.pop_back();
}
qm.push_back(i);
mn[i][j]=v[qn.front()][j];
mx[i][j]=v[qm.front()][j];
}
}
for(int i=x;i<=n;++i)
{
while(qn.size())
{
qn.pop_front(); ///min
}
while(qm.size())
{
qm.pop_front(); ///max
}
for(int j=1;j<=m;++j)
{
while(qn.size()>0 && qn.front()<(j-y+1))
{
qn.pop_front();
}
while(qn.size()>0 && mn[i][qn.back()]>=mn[i][j])
{
qn.pop_back();
}
qn.push_back(j);
while(qm.size()>0 && qm.front()<(j-y+1))
{
qm.pop_front();
}
while(qm.size()>0 && mx[i][qm.back()]<=mx[i][j])
{
qm.pop_back();
}
qm.push_back(j);
if(j>=y)
{
// cout<<i<<" "<<j<<" "<<mx[i][qm.front()]<<" "<<mn[i][qn.front()]<<"\n";
if(mx[i][qm.front()]-mn[i][qn.front()]<min)
{
min=mx[i][qm.front()]-mn[i][qn.front()];
cnt=0;
}
if(mx[i][qm.front()]-mn[i][qn.front()]==min)
{
++cnt;
}
}
}
}
}
cout<<min<<" "<<cnt<<"\n";
}
return 0;
}