Pagini recente » Cod sursa (job #1259488) | Cod sursa (job #783909) | Cod sursa (job #3001453) | Cod sursa (job #2455367) | Cod sursa (job #3194750)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
deque < pair < int, int > > dq1[1002];
deque < pair < int, int > > dq2[1002];
deque < pair < int, int > > dc1,dc2;
int a[1002][1002];
int n,m,k,M;
void process(int x, int y){
int i,j;
for(i = 1; i <= n; i++){
dq1[i].clear();
dq2[i].clear();
}
for(j = 1; j < x; j++){
for(i = 1; i <= n; i++){
while(!dq1[i].empty() && a[i][j] <= dq1[i].back().first) dq1[i].pop_back();
dq1[i].push_back({a[i][j], j});
while(!dq2[i].empty() && a[i][j] >= dq2[i].back().first) dq2[i].pop_back();
dq2[i].push_back({a[i][j], j});
}
}
for(j = x; j <= m; j++){
dc1.clear();
dc2.clear();
for(i = 1; i < y; i++){
if(dq1[i].front().second < j - x) dq1[i].pop_front();
if(dq2[i].front().second < j - x) dq2[i].pop_front();
while(!dq1[i].empty() && a[i][j] <= dq1[i].back().first) dq1[i].pop_back();
dq1[i].push_back({a[i][j], j});
while(!dq2[i].empty() && a[i][j] >= dq2[i].back().first) dq2[i].pop_back();
dq2[i].push_back({a[i][j], j});
while(!dc1.empty() && dq1[i].front().first <= dc1.back().first) dc1.pop_back();
dc1.push_back({dq1[i].front().first, i});
while(!dc2.empty() && dq2[i].front().first >= dc2.back().first) dc2.pop_back();
dc2.push_back({dq2[i].front().first, i});
}
for(i = y; i <= n; i++){
if(dq1[i].front().second < j - x) dq1[i].pop_front();
if(dq2[i].front().second < j - x) dq2[i].pop_front();
while(!dq1[i].empty() && a[i][j] <= dq1[i].back().first) dq1[i].pop_back();
dq1[i].push_back({a[i][j], j});
while(!dq2[i].empty() && a[i][j] >= dq2[i].back().first) dq2[i].pop_back();
dq2[i].push_back({a[i][j], j});
if(dc1.front().second < i - y) dc1.pop_front();
if(dc2.front().second < i - y) dc2.pop_front();
while(!dc1.empty() && dq1[i].front().first <= dc1.back().first) dc1.pop_back();
dc1.push_back({dq1[i].front().first, i});
while(!dc2.empty() && dq2[i].front().first >= dc2.back().first) dc2.pop_back();
dc2.push_back({dq2[i].front().first, i});
if(dc2.front().first - dc1.front().first > M){
M = dc2.front().first - dc1.front().first;
k = 1;
}
else if(dc2.front().first - dc1.front().first == M) k++;
}
}
}
int main()
{
int p,i,j,x,y;
fin >> n >> m >> p;
for(i = 1; i <= n; i++){
for(j = 1; j <= m; j++) fin >> a[i][j];
}
while(p--){
fin >> x >> y;
k = 0;
M = 1e9;
process(x,y);
process(y,x);
fout << M << " " << k << "\n";
}
return 0;
}