Pagini recente » Cod sursa (job #2355752) | Cod sursa (job #2895594) | Cod sursa (job #573825) | Cod sursa (job #1237044) | Cod sursa (job #2308927)
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstring>
#include <cmath>
#include <deque>
#include <climits>
using namespace std;
ifstream in("struti.in");
ofstream out("struti.out");
const int NMAX = 1005;
int v[NMAX][NMAX], n, m;
int d[NMAX];
pair<int, int> solve(int x, int y) {
vector<vector<int>> mn(n + 1, vector<int> (m + 1, 0));
vector<vector<int>> mx(n + 1, vector<int> (m + 1, 0));
for(int i = 1; i <= n; i ++) {
int l = 1, r = 1;
d[1] = 1;
for(int j = 2; j <= m; j ++) {
while(l <= r && v[i][d[r]] < v[i][j])
r --;
d[++ r] = j;
if(j >= x)
mx[i][j] = v[i][d[l]];
if(d[r] - d[l] == x - 1)
l ++;
}
l = 1, r = 1;
d[1] = 1;
for(int j = 2; j <= m; j ++) {
while(l <= r && v[i][d[r]] > v[i][j])
r --;
d[++ r] = j;
if(j >= x)
mn[i][j] = v[i][d[l]];
if(d[r] - d[l] == x - 1)
l ++;
}
}
vector<int> dmin(n + 1, 0);
vector<int> dmax(n + 1, 0);
int lmin, rmin, lmax, rmax;
int ans = INT_MAX, cnt = 0;
for(int j = x; j <= m; j ++) {
lmin = 1, rmin = 1, rmax = 1, lmax = 1;
dmin[1] = dmax[1] = 1;
for(int i = 2; i <= n; i ++) {
while(lmin <= rmin && mn[i][j] < mn[dmin[rmin]][j])
rmin --;
dmin[++ rmin] = i;
while(lmax <= rmax && mx[i][j] > mx[dmax[rmax]][j])
rmax --;
dmax[++ rmax] = i;
if(i >= y) {
if(mx[dmax[lmax]][j] - mn[dmin[lmin]][j] < ans) {
ans = mx[dmax[lmax]][j] - mn[dmin[lmin]][j];
cnt = 0;
}
if(mx[dmax[lmax]][j] - mn[dmin[lmin]][j] == ans)
cnt ++;
}
if(dmin[rmin] - dmin[lmin] == y - 1)
lmin ++;
if(dmax[rmax] - dmax[lmax] == y - 1)
lmax ++;
}
}
return {ans, cnt};
}
int main() {
int p;
in >> n >> m >> p;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
in >> v[i][j];
while(p --) {
int dx, dy;
in >> dx >> dy;
auto a = solve(dx, dy);
auto b = solve(dy, dx);
if(a.first == b.first && dx != dy)
a.second += b.second;
if(a.first > b.first)
swap(a, b);
out << a.first << " " << a.second << "\n";
}
return 0;
}