Pagini recente » Cod sursa (job #2818384) | Cod sursa (job #3304183) | Cod sursa (job #3333328) | Cod sursa (job #3340770) | Cod sursa (job #3334753)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
deque<int> maxi[1001], mini[1001];
int w[1001][1001], n, m, p, dx, dy, nr, minim, minix[1001][1001], maxix[1001][1001], miniy[1001][1001], maxiy[1001][1001], aux;
void func()
{
for(int k=0; k<dx; k++)
{
for(int j=0; j<m; j++)
{
while(!maxi[j].empty()&&w[maxi[j].back()][j]<=w[k][j])
{
maxi[j].pop_back();
}
maxi[j].push_back(k);
while(!mini[j].empty()&&w[mini[j].back()][j]>=w[k][j])
{
mini[j].pop_back();
}
mini[j].push_back(k);
}
}
for(int k=0; k<=n-dx; k++)
{
for(int j=0; j<m; j++)
{
while(!maxi[j].empty()&&w[maxi[j].back()][j]<=w[k+dx-1][j])
{
maxi[j].pop_back();
}
maxi[j].push_back(k+dx-1);
while(!mini[j].empty()&&w[mini[j].back()][j]>=w[k+dx-1][j])
{
mini[j].pop_back();
}
mini[j].push_back(k+dx-1);
minix[k][j]=w[mini[j].front()][j];
maxix[k][j]=w[maxi[j].front()][j];
if(maxi[j].front()==k)
{
maxi[j].pop_front();
}
if(mini[j].front()==k)
{
mini[j].pop_front();
}
}
}
for(int j=0; j<m; j++)
{
while(!maxi[j].empty())
{
maxi[j].pop_front();
}
while(!mini[j].empty())
{
mini[j].pop_front();
}
}
for(int k=0; k<=n-dx; k++)
{
for(int j=0; j<dy; j++)
{
while(!maxi[k].empty()&&maxix[k][maxi[k].back()]<=maxix[k][j])
{
maxi[k].pop_back();
}
maxi[k].push_back(j);
while(!mini[k].empty()&&minix[k][mini[k].back()]>=minix[k][j])
{
mini[k].pop_back();
}
mini[k].push_back(j);
}
}
for(int k=0; k<=n-dx; k++)
{
for(int j=0; j<=m-dy; j++)
{
while(!maxi[k].empty()&&maxix[k][maxi[k].back()]<=maxix[k][j+dy-1])
{
maxi[k].pop_back();
}
maxi[k].push_back(j+dy-1);
while(!mini[k].empty()&&minix[k][mini[k].back()]>=minix[k][j+dy-1])
{
mini[k].pop_back();
}
mini[k].push_back(j+dy-1);
miniy[k][j]=minix[k][mini[k].front()];
maxiy[k][j]=maxix[k][maxi[k].front()];
if(maxi[k].front()==j)
{
maxi[k].pop_front();
}
if(mini[k].front()==j)
{
mini[k].pop_front();
}
}
}
for(int j=0; j<m; j++)
{
while(!maxi[j].empty())
{
maxi[j].pop_front();
}
while(!mini[j].empty())
{
mini[j].pop_front();
}
}
/*for(int k=0; k<=n-dx; k++)
{
for(int j=0; j<=m-dy; j++)
{
fout<<miniy[k][j]<<" ";
}
fout<<"\n";
}
fout<<"\n";
for(int k=0; k<=n-dx; k++)
{
for(int j=0; j<=m-dy; j++)
{
fout<<maxiy[k][j]<<" ";
}
fout<<"\n";
}
fout<<"\n\n";*/
for(int k=0; k<=n-dx; k++)
{
for(int j=0; j<=m-dy; j++)
{
if(maxiy[k][j]-miniy[k][j]<minim)
{
minim=maxiy[k][j]-miniy[k][j];
nr=0;
}
if(maxiy[k][j]-miniy[k][j]==minim)
{
nr++;
}
}
}
}
int main()
{
fin>>n>>m>>p;
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
fin>>w[i][j];
}
}
for(int i=0; i<p; i++)
{
fin>>dy>>dx;
minim=10000000;
nr=0;
func();
if(dx!=dy)
{
aux=dx;
dx=dy;
dy=aux;
func();
}
fout<<minim<<" "<<nr<<"\n";
}
return 0;
}