Cod sursa(job #2133411)

Utilizator flibiaVisanu Cristian flibia Data 16 februarie 2018 21:56:01
Problema Struti Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
//sa speram ca intra in memory limit xd
#pragma GCC optimize("03")
#include <bits/stdc++.h>
#define N 1003

using namespace std;

int n, m, x, y, q, a[N][N], bst, cnt;
vector <int> vmax[N][10], vmin[N][10];

#define dim 100000
char buff[dim];
int p = 0;

void read(int &nr){
	nr = 0;
	while(buff[p] < '0' || buff[p] > '9')
		if(++p == dim)
			fread(buff, 1, dim, stdin), p = 0;
	while(buff[p] >= '0' && buff[p] <= '9'){
		nr = 10 * nr + buff[p] - '0';
		if(++p == dim)
			fread(buff, 1, dim, stdin), p = 0;
	}
}

void solve(int dx, int dy){
	int l, r, sz;
	for(int i = 1; i + dx - 1 <= n; i++)
		for(int j = 1; j + dy - 1 <= m; j++){
			int mx = -1, mn = 8000;
			l = j - 1;
			r = j + dy - 2;
			sz = log2(r - l + 1);
			for(int p = i; p <= i + dx - 1; p++){
				mx = max(mx, max(vmax[p][sz][l], vmax[p][sz][r + 1 - (1 << sz)]));
				mn = min(mn, min(vmin[p][sz][l], vmin[p][sz][r + 1 - (1 << sz)]));
			}
			if(mx - mn == bst)
				cnt++;
			else if(mx - mn < bst){
				bst = mx - mn;
				cnt = 1;
			}
		}
}

int main(){
	freopen("struti.in", "r", stdin);
	freopen("struti.out", "w", stdout);
	read(n); read(m); read(q);
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
			read(x), vmax[i][0].push_back(x), vmin[i][0].push_back(x);
	int sz = log2(m);
	for(int i = 1; i <= n; i++)
		for(int pw = 1; pw <= sz; pw++)
			for(int j = 0; j + (1 << pw) <= m; j++){
				vmin[i][pw].push_back(min(vmin[i][pw - 1][j], vmin[i][pw - 1][j + (1 << (pw - 1))]));
				vmax[i][pw].push_back(max(vmax[i][pw - 1][j], vmax[i][pw - 1][j + (1 << (pw - 1))]));	
			}			
	while(q--){
		read(x); read(y);
		cnt = 0;
		bst = 8001;
		solve(x, y);
		if(x != y)
			solve(y, x);
		cout << bst << ' ' << cnt << '\n';
	}
	return 0;
}