Pagini recente » Cod sursa (job #807882) | Rating ionpopescu (ionpopescu1234) | Cod sursa (job #930787) | Cod sursa (job #1223983) | Cod sursa (job #2120911)
#include <fstream>
#include <deque>
using namespace std;
int a[1001][1001],vmax[1001][1001],vmin[1001][1001];
deque <int> Max;
deque <int> Min;
int main()
{ int n,m,i,j,sol,nr,p,q,x,y,sum;
ifstream f("struti.in");
ofstream g("struti.out");
f>>n>>m>>p;
for (i=1;i<=n;++i)
for (j=1;j<=m;++j)
f>>a[i][j];
for (q=1;q<=p;++q) {
f>>x>>y;
sol=8001,nr=0;
for (i=1;i<=n;++i) {
for (j=1;j<=m;++j) {
while (!Max.empty() && a[i][j]>=a[i][Max.back()])
Max.pop_back();
Max.push_back(j);
while (!Min.empty() && a[i][j]<=a[i][Min.back()])
Min.pop_back();
Min.push_back(j);
if (j>=y) vmax[i][j-y+1]=a[i][Max.front()],vmin[i][j-y+1]=a[i][Min.front()];
if (Max.front()==j-y+1) Max.pop_front();
if (Min.front()==j-y+1) Min.pop_front();
}
Max.clear();Min.clear();
}
for (j=1;j<=m-y+1;++j) {
for (i=1;i<=n;++i) {
while (!Max.empty() && vmax[i][j]>=vmax[Max.back()][j])
Max.pop_back();
Max.push_back(i);
while (!Min.empty() && vmin[i][j]<=vmin[Min.back()][j])
Min.pop_back();
Min.push_back(i);
if (i>=x) {
sum=vmax[Max.front()][j]-vmin[Min.front()][j];
if (sol>sum) sol=sum,nr=1;
else if (sol==sum) ++nr;
}
if (Max.front()==i-x+1) Max.pop_front();
if (Min.front()==i-x+1) Min.pop_front();
}
Max.clear();Min.clear();
}
if (x!=y) {
swap(x,y);
for (i=1;i<=n;++i) {
for (j=1;j<=m;++j) {
while (!Max.empty() && a[i][j]>=a[i][Max.back()])
Max.pop_back();
Max.push_back(j);
while (!Min.empty() && a[i][j]<=a[i][Min.back()])
Min.pop_back();
Min.push_back(j);
if (j>=y) vmax[i][j-y+1]=a[i][Max.front()],vmin[i][j-y+1]=a[i][Min.front()];
if (Max.front()==j-y+1) Max.pop_front();
if (Min.front()==j-y+1) Min.pop_front();
}
Max.clear();Min.clear();
}
for (j=1;j<=m-y+1;++j) {
for (i=1;i<=n;++i) {
while (!Max.empty() && vmax[i][j]>=vmax[Max.back()][j])
Max.pop_back();
Max.push_back(i);
while (!Min.empty() && vmin[i][j]<=vmin[Min.back()][j])
Min.pop_back();
Min.push_back(i);
if (i>=x) {
sum=vmax[Max.front()][j]-vmin[Min.front()][j];
if (sol>sum) sol=sum,nr=1;
else if (sol==sum) ++nr;
}
if (Max.front()==i-x+1) Max.pop_front();
if (Min.front()==i-x+1) Min.pop_front();
}
Max.clear();Min.clear();
}
}
g<<sol<<" "<<nr<<'\n';
}
return 0;
}