Pagini recente » Borderou de evaluare (job #1145892) | Cod sursa (job #3323033) | Cod sursa (job #3341179)
#include <fstream>
#include <deque>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int n,m,p;
int A[1005][1005];
int maxr[1005][1005];
int maxrc[1005][1005];
int minr[1005][1005];
int minrc[1005][1005];
deque <int> dqmax, dqmin;
int mindxy, cntxy;
int mindyx, cntyx;
void read()
{
fin >> n >> m >> p;
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= m; ++j){
fin >> A[i][j];
}
}
}
void buildr(int x)
{
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= m; ++j){
maxr[i][j] = minr[i][j] = 0;
}
}
for(int i = 1; i <= n; ++i){
dqmax.clear();
dqmin.clear();
for(int j = 1; j <= m; ++j){
while(!dqmax.empty() && A[i][dqmax.back()] <= A[i][j]){
dqmax.pop_back();
}
dqmax.push_back(j);
if(dqmax.front() <= j - x){
dqmax.pop_front();
}
if(j >= x){
maxr[i][j] = A[i][dqmax.front()];
}
while(!dqmin.empty() && A[i][dqmin.back()] >= A[i][j]){
dqmin.pop_back();
}
dqmin.push_back(j);
if(dqmin.front() <= j - x){
dqmin.pop_front();
}
if(j >= x){
minr[i][j] = A[i][dqmin.front()];
}
}
}
}
void buildrc(int x, int y)
{
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= m; ++j){
maxrc[i][j] = minrc[i][j] = 0;
}
}
for(int j = x; j <= m; ++j){
dqmax.clear();
dqmin.clear();
for(int i = 1; i <= n; ++i){
while(!dqmax.empty() && maxr[dqmax.back()][j] <= maxr[i][j]){
dqmax.pop_back();
}
dqmax.push_back(i);
if(dqmax.front() <= i - y){
dqmax.pop_front();
}
if(i >= y){
maxrc[i][j] = maxr[dqmax.front()][j];
}
while(!dqmin.empty() && minr[dqmin.back()][j] >= minr[i][j]){
dqmin.pop_back();
}
dqmin.push_back(i);
if(dqmin.front() <= i - y){
dqmin.pop_front();
}
if(i >= y){
minrc[i][j] = minr[dqmin.front()][j];
}
}
}
}
void setMinDxy(int x, int y)
{
buildr(x);
buildrc(x, y);
mindxy = 8000;
cntxy = 0;
for(int i = y; i <= n; ++i){
for(int j = x; j <= m; ++j){
if(maxrc[i][j] - minrc[i][j] < mindxy){
mindxy = maxrc[i][j] - minrc[i][j];
cntxy = 1;
}
else if(maxrc[i][j] - minrc[i][j] == mindxy){
++cntxy;
}
}
}
}
void setMinDyx(int y, int x)
{
buildr(x);
buildrc(x, y);
mindyx = 8000;
cntyx = 0;
for(int i = y; i <= n; ++i){
for(int j = x; j <= m; ++j){
if(maxrc[i][j] - minrc[i][j] < mindyx){
mindyx = maxrc[i][j] - minrc[i][j];
cntyx = 1;
}
else if(maxrc[i][j] - minrc[i][j] == mindyx){
++cntyx;
}
}
}
}
void runAlgorithm()
{
for(int i = 0; i < p; ++i){
int dx,dy;
fin >> dx >> dy;
setMinDxy(dx, dy);
setMinDyx(dx, dy);
if(mindxy < mindyx){
fout << mindxy << ' ' << cntxy << '\n';
}
else if(mindxy > mindyx){
fout << mindyx << ' ' << cntyx << '\n';
}
else if(dx != dy){
fout << mindyx << ' ' << cntyx + cntxy << '\n';
}
else{
fout << mindyx << ' ' << cntyx << '\n';
}
}
}
int main()
{
read();
runAlgorithm();
return 0;
}