Pagini recente » Borderou de evaluare (job #1297225) | Borderou de evaluare (job #2235162) | Cod sursa (job #2126717) | Cod sursa (job #3269722) | Cod sursa (job #2098862)
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
ifstream in("struti.in");
ofstream out("struti.out");
const int NMAX = 1000;
const int INF = 1 << 30;
int n, m, q, ans, nr;
int dx, dy;
int a[1 + NMAX][1 + NMAX];
int minn[1 + NMAX][1 + NMAX];
int maxx[1 + NMAX][1 + NMAX];
void solve() {
deque < int > dmin;
deque < int > dmax;
for(int col = 1; col <= m; col++) {
dmin.clear();
dmax.clear();
for(int lin = 1; lin <= n; lin++) {
while(!dmax.empty() && a[dmax.back()][col] <= a[lin][col])
dmax.pop_back();
while(!dmin.empty() && a[dmin.back()][col] >= a[lin][col])
dmin.pop_back();
dmax.push_back(lin);
dmin.push_back(lin);
if(lin - dmax.front() == dx)
dmax.pop_front();
if(lin - dmin.front() == dx)
dmin.pop_front();
maxx[lin][col] = a[dmax.front()][col];
minn[lin][col] = a[dmin.front()][col];
}
}
for(int lin = dx; lin <= n; lin++) {
dmin.clear();
dmax.clear();
for(int col = 1; col <= m; col++) {
while(!dmax.empty() && maxx[lin][dmax.back()] <= maxx[lin][col])
dmax.pop_back();
while(!dmin.empty() && minn[lin][dmin.back()] >= minn[lin][col])
dmin.pop_back();
dmax.push_back(col);
dmin.push_back(col);
if(col - dmax.front() == dy)
dmax.pop_front();
if(col - dmin.front() == dy)
dmin.pop_front();
if(dy <= col) {
int pretender = maxx[lin][dmax.front()] - minn[lin][dmin.front()];
if(pretender < ans) {
ans = pretender;
nr = 1;
} else if(pretender == ans) {
nr++;
}
}
}
}
}
int main()
{
in >> n >> m >> q;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
in >> a[i][j];
}
}
for(int i = 1; i <= q; i++) {
in >> dx >> dy;
ans = INF;
nr = 0;
solve();
if(dx != dy) {
swap(dx, dy);
solve();
}
out << ans << ' ' << nr << '\n';
}
in.close();
out.close();
return 0;
}