Cod sursa(job #3317023)

Utilizator Alexutu008Ionita Alexandru-Dumitru Alexutu008 Data 21 octombrie 2025 18:16:27
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.43 kb
#include<bits/stdc++.h>

using namespace std;

int n, m;
int a[1001][1001], v1[1001][1001], v2[1001][1001]; // v1 de min, v2 de max
int p;

pair<int, int> solve(int x, int y) {
	deque<int> d1, d2, d3, d4;
	//linii si secv de lungime y
	//col si secv de x
	for (int i = 1; i <= n; ++i) {
		d1.clear();
		d2.clear();
		for (int j = 1; j <= m; ++j) {
			while (!d1.empty() && a[i][d1.back()] >= a[i][j]) {
				d1.pop_back();
			}
			d1.push_back(j);
			if (d1.front() <= j - y) {
				d1.pop_front();
			}

			while (!d2.empty() && a[i][d2.back()] <= a[i][j]) {
				d2.pop_back();
			}
			d2.push_back(j);
			if (d2.front() <= j - y) {
				d2.pop_front();
			}
			if (j >= y) {
				v1[i][j - y + 1] = a[i][d1.front()];
				v2[i][j - y + 1] = a[i][d2.front()];
			}
		}
	}
	for (int j = 1; j <= m - y + 1; ++j) {
		d3.clear();
		d4.clear();
		for (int i = 1; i <= n; ++i) {
			while (!d3.empty() && v1[d3.back()][j] >= v1[i][j]) {
				d3.pop_back();
			}
			d3.push_back(i);
			if (d3.front() <= i - x) {
				d3.pop_front();
			}

			while (!d4.empty() && v2[d4.back()][j] <= v2[i][j]) {
				d4.pop_back();
			}
			d4.push_back(i);
			if (d4.front() <= i - x) {
				d4.pop_front();
			}
			if (i >= x) {
				v1[i - x + 1][j] = v1[d3.front()][j];
				v2[i - x + 1][j] = v2[d4.front()][j];
			}
		}
	}
	int mn = INT_MAX, cnt = 0;


	for (int i = 1; i <= n - x + 1; ++i) {
		for(int j = 1; j <= m - y + 1; ++j) {
			if (mn == v2[i][j] - v1[i][j]) {
				++cnt;
			}
			else if (mn > v2[i][j] - v1[i][j]) {
				mn = v2[i][j] - v1[i][j];
				cnt = 1;
			}
		}
	}
	return make_pair(mn, cnt);
}

int main() {
	freopen("struti.in", "r", stdin);
	freopen("struti.out", "w", stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin >> n >> m >> p;
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m; ++j) {
			cin >> a[i][j];
		}
	}
	int x, y;
	while (p--) {
		cin >> x >> y;
		/*cout << solve(x, y).first << ' ';*/
		if (x != y) {
			auto sol1 = solve(x, y);
			auto sol2 = solve(y, x);
			if (sol1.first < sol2.first) {
				cout << sol1.first << ' ' << sol1.second << '\n';
			}
			else if (sol2.first < sol1.first) {
				cout << sol2.first << ' ' << sol2.second << '\n';
			}
			else {
				cout << sol1.first << ' ' << sol1.second + sol2.second << '\n';
			}
		}
		else {
			auto sol1 = solve(x, y);
			cout << sol1.first << ' ' << sol1.second << '\n';
		}
	}

	return 0;
}