Pagini recente » Cod sursa (job #3236) | Cod sursa (job #2867901) | Cod sursa (job #2581328) | Cod sursa (job #1228289) | Cod sursa (job #1066859)
#include <fstream>
#include <deque>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int N, M, P, dx, dy, sol, nr_ap;
int a[1005][1005], maxi[1005][1005], mini[1005][1005];
deque<pair<int,int>> dmin, dmax;
int cauta(int x, int y)
{
int i, j;
for(j = 1; j <= M; j++)
{
for(i = 1; i < x; i++)
{
while(!dmax.empty() && dmax.back().first <= a[i][j])dmax.pop_back();
dmax.push_back(make_pair(a[i][j], i));
while(!dmin.empty() && dmin.back().first >= a[i][j])dmin.pop_back();
dmin.push_back(make_pair(a[i][j], i));
}
for( i = x ; i <= N; i++)
{
while(!dmax.empty() && dmax.back().first <= a[i][j])dmax.pop_back();
dmax.push_back(make_pair(a[i][j], i));
while(!dmin.empty() && dmin.back().first >= a[i][j])dmin.pop_back();
dmin.push_back(make_pair(a[i][j], i));
if(dmax.front().second <= i - x)dmax.pop_front();
maxi[i][j] = dmax.front().first;
if(dmin.front().second <= i - x)dmin.pop_front();
mini[i][j] = dmin.front().first;
}
while(!dmax.empty())dmax.pop_back();
while(!dmin.empty())dmin.pop_back();
}
for(int i = x; i <= N; i++)
{
for(j = 1; j < y; j++)
{
while(!dmax.empty() && dmax.back().first <= maxi[i][j])dmax.pop_back();
dmax.push_back(make_pair(maxi[i][j], j));
while(!dmin.empty() && dmin.back().first >= mini[i][j])dmin.pop_back();
dmin.push_back(make_pair(mini[i][j], j));
}
for( j = y ; j <= M; j++)
{
while(!dmax.empty() && dmax.back().first <= maxi[i][j])dmax.pop_back();
dmax.push_back(make_pair(maxi[i][j], j));
while(!dmin.empty() && dmin.back().first >= mini[i][j])dmin.pop_back();
dmin.push_back(make_pair(mini[i][j], j));
if(dmax.front().second <= j - y)dmax.pop_front();
if(dmin.front().second <= j - y)dmin.pop_front();
maxi[i][j] = dmax.front().first;
mini[i][j] = dmin.front().first;
int dif = maxi[i][j] - mini[i][j];
if(dif < sol)
{
sol = dif;
nr_ap = 1;
}
else if(dif == sol)nr_ap++;
}
while(!dmax.empty())dmax.pop_back();
while(!dmin.empty())dmin.pop_back();
}
}
int main()
{
int i, j;
fin >> N >> M >> P;
for( i = 1; i <= N; i++)
for( j = 1; j <= M; j++)
fin >> a[i][j];
for(i = 1; i <= P; i++)
{
fin >> dx >> dy;
sol = 8001;
cauta(dx, dy);
if(dx != dy)cauta(dy, dx);
fout<<sol<<" "<<nr_ap<<"\n";
}
return 0;
}