Cod sursa(job #1053699)

Utilizator Robert29FMI Tilica Robert Robert29 Data 12 decembrie 2013 21:50:06
Problema Struti Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.49 kb
#include<fstream>
using namespace std;
#define dim 1001
ifstream fi("struti.in");
ofstream fo("struti.out");
int l1, l2, f1, f2, nr, minim, a[dim][dim], b[dim][dim], d1[dim], d2[dim], n, m, k, i, j, x, y, c[dim][dim];
int main(){
	fi >> n >> m >> k;
	for (i = 1; i <= n; ++i)
	for (j = 1; j <= m; ++j)
		fi >> a[i][j];
	for (i = 1; i <= n; ++i)
		b[i][1] = c[i][1] = a[i][1];
	for (int o = 1; o <= k; ++o){
		fi >> x >> y;
		nr = 0;
		minim = 9000;

		for (i = 1; i <= n; ++i){
			d1[1] = d2[1] = l1 = l2 = f1 = f2 = 1;
			for (j = 2; j <= m; ++j){

				while (l1 >= f1&&a[i][d1[l1]] >= a[i][j])
					l1--;
				d1[++l1] = j;
				while (d1[f1] + x <= j)
					f1++;

				while (l2 >= f2&&a[i][d2[l2]] <= a[i][j])
					l2--;
				d2[++l2] = j;
				while (d2[f2] + x <= j)
					f2++;

				b[i][j] = a[i][d2[f2]];
				c[i][j] = a[i][d1[f1]];
			}
		}

		for (j = x; j <= m; ++j){

			d2[1] = l2 = f2 = d1[1] = l1 = f1 = 1;
			for (i = 2; i <= n; ++i){

				while (l1 >= f1&&c[d1[l1]][j] >= c[i][j])
					l1--;
				d1[++l1] = i;
				while (d1[f1] + y <= i)
					f1++;

				while (l2 >= f2&&b[d2[l2]][j] <= b[i][j])
					l2--;
				d2[++l2] = i;
				while (d2[f2] + y <= i)
					f2++;
				if (i >= y)
				if (minim>b[d2[f2]][j] - c[d1[f1]][j]){
					minim = b[d2[f2]][j] - c[d1[f1]][j];
					nr = 1;
				}
				else if (minim == b[d2[f2]][j] - c[d1[f1]][j])
					nr++;

			}
		}
		if (x != y){
			for (i = 1; i <= n; ++i){
				d1[1] = d2[1] = l1 = l2 = f1 = f2 = 1;
				for (j = 2; j <= m; ++j){

					while (l1 >= f1&&a[i][d1[l1]] >= a[i][j])
						l1--;
					d1[++l1] = j;
					while (d1[f1] + y <= j)
						f1++;

					while (l2 >= f2&&a[i][d2[l2]] <= a[i][j])
						l2--;
					d2[++l2] = j;
					while (d2[f2] + y <= j)
						f2++;

					b[i][j] = a[i][d2[f2]];
					c[i][j] = a[i][d1[f1]];
				}
			}

			for (j = y; j <= m; ++j){

				d2[1] = l2 = f2 = d1[1] = l1 = f1 = 1;
				for (i = 2; i <= n; ++i){

					while (l1 >= f1&&c[d1[l1]][j] >= c[i][j])
						l1--;
					d1[++l1] = i;
					while (d1[f1] + x <= i)
						f1++;

					while (l2 >= f2&&b[d2[l2]][j] <= b[i][j])
						l2--;
					d2[++l2] = i;
					while (d2[f2] + x <= i)
						f2++;
					if (i >= x)
					if (minim>b[d2[f2]][j] - c[d1[f1]][j]){
						minim = b[d2[f2]][j] - c[d1[f1]][j];
						nr = 1;
					}
					else if (minim == b[d2[f2]][j] - c[d1[f1]][j])
						nr++;

				}
			}
		}

		fo << minim << ' ' << nr << '\n';

	}


	fo.close();
	fi.close();
	return 0;
}