Cod sursa(job #1261278)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 12 noiembrie 2014 09:55:29
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.84 kb
#include<fstream>
using namespace std;
int n, m, i, j,  k, p1, u1, p2, u2, a, b, minim, nr, dif, aux;
int A[1001][1001], B[1001][1001], C[1001][1001], d1[1001], d2[1001];
ifstream fin("struti.in");
ofstream fout("struti.out");
int main(){
	fin>> n >> m >> k;
	for(i = 1; i <= n; i++){
		for(j = 1; j <= m; j++){
			fin>> A[i][j];
		}
	}
	for(; k; k--){
		fin>> a >> b;
		minim = 8000;
		nr = 0;
		for(i = 1; i <= n; i++){
			p1 = 1;
			u1 = 1;
			p2= 1;
			u2 = 1;
			d1[1] = 1;
			d2[1] = 1;
			for(j = 2; j <= m; j++){
				while(p1 <= u1 && A[i][j] < A[i][d1[u1]]){
					u1--;
				}
				u1++;
				d1[u1] = j;
				if(j - d1[p1] == b){
					p1++;
				}
				if(j >= b){
					B[i][j] = A[i][d1[p1]];
				}
				while(p2 <= u2 && A[i][j] > A[i][d2[u2]]){
					u2--;
				}
				u2++;
				d2[u2] = j;
				if(j - d2[p2] == b){
					p2++;
				}
				if(j >= b){
					C[i][j] = A[i][d2[p2]];
				}
			}
		}
		for(j = b; j <= m; j++){
			p1 = 1;
			u1 = 1;
			p2 = 1;
			u2 = 1;
			d1[1] = 1;
			d2[1] = 1;
			for(i = 2; i <= n; i++){
				while(p1 <= u1 && B[i][j] < B[d1[u1]][j]){
					u1--;
				}
				u1++;
				d1[u1] = i;
				if(i - d1[p1] == a){
					p1++;
				}
				while(p2 <= u2 && C[i][j] > C[d2[u2]][j]){
					u2--;
				}
				u2++;
				d2[u2] = i;
				if(i - d2[p2] == a){
					p2++;
				}
				if(i >= a){
					dif = C[d2[p2]][j] - B[d1[p1]][j];
					if(dif < minim){
						minim = dif;
						nr = 1;
					}
					else{
						if(dif == minim){
							nr++;
						}
					}
				}
			}
		}
		if(a != b){
			aux = a;
			a = b;
			b = aux;
			for(i = 1; i <= n; i++){
				p1 = 1;
				u1 = 1;
				p2= 1;
				u2 = 1;
				d1[1] = 1;
				d2[1] = 1;
				for(j = 2; j <= m; j++){
					while(p1 <= u1 && A[i][j] < A[i][d1[u1]]){
						u1--;
					}
					u1++;
					d1[u1] = j;
					if(j - d1[p1] == b){
						p1++;
					}
					if(j >= b){
						B[i][j] = A[i][d1[p1]];
					}
					while(p2 <= u2 && A[i][j] > A[i][d2[u2]]){
						u2--;
					}
					u2++;
					d2[u2] = j;
					if(j - d2[p2] == b){
						p2++;
					}
					if(j >= b){
						C[i][j] = A[i][d2[p2]];
					}
				}
			}
			for(j = b; j <= m; j++){
				p1 = 1;
				u1 = 1;
				p2 = 1;
				u2 = 1;
				d1[1] = 1;
				d2[1] = 1;
				for(i = 2; i <= n; i++){
					while(p1 <= u1 && B[i][j] < B[d1[u1]][j]){
						u1--;
					}
					u1++;
					d1[u1] = i;
					if(i - d1[p1] == a){
						p1++;
					}
					while(p2 <= u2 && C[i][j] > C[d2[u2]][j]){
						u2--;
					}
					u2++;
					d2[u2] = i;
					if(i - d2[p2] == a){
						p2++;
					}
					if(i >= a){
						dif = C[d2[p2]][j] - B[d1[p1]][j];
						if(dif < minim){
							minim = dif;
							nr = 1;
						}
						else{
							if(dif == minim){
								nr++;
							}
						}
					}
				}
			}
		}
		fout<< minim <<" "<< nr <<"\n";
	}
	return 0;
}