Pagini recente » Cod sursa (job #2765256) | Cod sursa (job #2932303) | Cod sursa (job #217671) | Cod sursa (job #1461733) | Cod sursa (job #2429657)
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int m,n,p;
deque<int> minim;
deque<int> maxim;
short Map[1100][1100],Min[1100][1100],Max[1100][1100],My,Mx;
void calc(int dx,int dy,int &r1,int &r2)
{
int val,minFinal=1000000,counting=0;
for(int r = 1; r<=2; r++)
{
My = 0;
Mx = 0;
for(int i = 1; i<=n; i++)
{
maxim.clear();
minim.clear();
My++;
Mx = 0;
for(int j = 1; j<=m; j++)
{
while(minim.size() && Map[i][minim.back()] >= Map[i][j])
minim.pop_back();
while(maxim.size() && Map[i][maxim.back()] <= Map[i][j])
maxim.pop_back();
maxim.push_back(j);
minim.push_back(j);
if(maxim.front() == j-dx)
maxim.pop_front();
if(minim.front() == j-dx)
minim.pop_front();
if(j>=dx)
{
Min[My][++Mx] = Map[i][minim.front()];
Max[My][Mx] = Map[i][maxim.front()];
}
}
}
for(int j = 1; j<=Mx; j++)
{
minim.clear();
maxim.clear();
for(int i = 1; i<=My; i++)
{
while(minim.size() && Min[minim.back()][j] >= Min[i][j])
minim.pop_back();
while(maxim.size() && Max[maxim.back()][j] <= Max[i][j])
maxim.pop_back();
maxim.push_back(i);
minim.push_back(i);
if(maxim.front()==i-dy)
maxim.pop_front();
if(minim.front()==i-dy)
minim.pop_front();
val = Max[maxim.front()][j]-Min[minim.front()][j];
if(i>=dy && val<minFinal)
{
minFinal = val;
counting = 0;
}
if(i>=dy && val == minFinal)
counting++;
}
}
if(dx!=dy)
swap(dx,dy);
else
r=2;
}
r1=minFinal;
r2=counting;
}
int main()
{
int dx,dy,r1,r2;
fin>>m>>n>>p;
for(int i = 1; i<=n; i++)
for(int j = 1; j<=m; j++)
fin>>Map[i][j];
for(int q = 1; q<=p; q++)
{
fin>>dx>>dy;
calc(dx,dy,r1,r2);
fout<<r1<<" "<<r2<<'\n';
}
return 0;
}