Cod sursa(job #2673146)

Utilizator gavra_bogdanBogdan Gavra gavra_bogdan Data 15 noiembrie 2020 21:34:45
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <deque>
#pragma GCC optimize ("O3")
#define pi std::pair<int, int>

using namespace std;

const int nmax = 1e3 + 5;
const int inf = 2e9;
int v[nmax][nmax], n, m, q, mn, nr, x;
deque<pi>dmin[nmax], dmax[nmax], dmn, dmx;

void dewit(deque<pi>& dq, pi curr, int i, int j, int semn) {
	if (!dq.empty() and dq.front().second < j - i + 1) dq.pop_front();
	while (!dq.empty() and dq.back().first * semn > curr.first * semn) dq.pop_back();
	dq.push_back(curr);
}

void solve(int x, int y) {
	for (int j = 1; j <= m; j++) {
		dmin[j].clear();
		dmax[j].clear();
		for (int i = 1; i < x; i++) {
			dewit(dmin[j], { v[i][j], i }, 2, 0, 1);
			dewit(dmax[j], { v[i][j], i }, 2, 0, -1);
		}
	}
	for (int i = x; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			pi curr = { v[i][j], i };
			dewit(dmin[j], curr, x, i, 1);
			dewit(dmax[j], curr, x, i, -1);
		}
		dmn.clear();
		dmx.clear();
		for (int j = 1; j < y; j++) {
			dewit(dmn, { dmin[j].front().first, j }, 2, 0, 1);
			dewit(dmx, { dmax[j].front().first, j }, 2, 0, -1);
		}
		for (int j = y; j <= m; j++) {
			dewit(dmn, {dmin[j].front().first, j}, y, j, 1);
			dewit(dmx, { dmax[j].front().first, j }, y, j, -1);
			if (dmx.front().first - dmn.front().first < mn) mn = dmx.front().first - dmn.front().first, nr = 0;
			if (dmx.front().first - dmn.front().first == mn) nr++;
		}
	}
}

int main() {
	ifstream fin("struti.in");
	ofstream fout("struti.out");
	ios_base::sync_with_stdio(false);
	fin.tie(0);
	fout.tie(0);
	fin >> n >> m >> q;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			fin >> v[i][j];
	while (q--) {
		int x, y;
		mn = inf, nr = 0;
		fin >> x >> y;
		solve(x, y);
		if (x != y) solve(y, x);
		fout << mn << " " << nr << "\n";
	}
}