Cod sursa(job #2212940)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 15 iunie 2018 13:09:34
Problema Struti Scor 80
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.76 kb
#include <deque>
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin ("struti.in");
ofstream fout ("struti.out");

const int Dim = 1001,Inf = 0x3f3f3f3f;
int A[Dim][Dim], M1[Dim][Dim],M2[Dim][Dim],n,m,p,m1[Dim][Dim],m2[Dim][Dim],mi,nr;
deque < int > D;
void Deq(int sizex,int sizey);

int main() {
	
	fin >> n >> m >> p;
	for ( int i = 1; i <= n; ++i)
		for ( int j = 1; j <= m; ++j)
			fin >> A[i][j];
		int x,y;
	for ( ; p > 0; --p)  {
			fin >> x >> y;
			mi = Inf;
			nr = 0;
			Deq(x,y);
			if ( y != x)
				Deq(y,x);
			fout << mi << " " << nr << "\n";
			
	}
}

void Deq(int sizex,int sizey) {
	D.clear();
	for ( int j = 1; j <= m; ++j) {
		D.push_front(1);
		M1[1][j] = A[1][j];
		for ( int i = 2; i <= sizex; ++i) {
			while(D.size() and A[D.back()][j] <= A[i][j])
				D.pop_back();
			D.push_back(i);
			M1[i][j] = A[D.front()][j];
			}
		
		for ( int i = sizex + 1; i <= n; ++i) { 
			 while(D.size() and A[D.back()][j] <= A[i][j])
					D.pop_back();
			D.push_back(i);
			while(D.size() and i - D.front() == sizex)
				D.pop_front();
			M1[i][j] = A[D.front()][j];
			}
		D.clear();
		}
	D.clear(); 
	for ( int i = 1; i <= n; ++i) {
		D.push_back(1);
		M2[i][1] = M1[i][1];
		for ( int j = 2; j <= sizey; ++j) {
			while(D.size() and M1[i][j] >= M1[i][D.back()] )
				D.pop_back();
			D.push_back(j);
			M2[i][j] = M1[i][D.front()];
			}
	
		for (int  j = sizey + 1 ; j <= m; ++j) {
			while ( D.size() and M1[i][j] >= M1[i][D.back()] )
				D.pop_back();
			D.push_back(j);
			while(D.size() and j - D.front() == sizey)
				D.pop_front();
			M2[i][j] = M1[i][D.front()];
			}
		D.clear();}
		
	D.clear();
	for ( int j = 1; j <= m; ++j) {
		D.push_front(1);
		m1[1][j] = A[1][j];
		for ( int i = 2; i <= sizex; ++i) {
			while(D.size() and A[D.back()][j] >= A[i][j])
				D.pop_back();
			D.push_back(i);
			m1[i][j] = A[D.front()][j];
			}
		
		for ( int i = sizex + 1; i <= n; ++i) { 
			 while(D.size() and A[D.back()][j] >= A[i][j])
					D.pop_back();
			D.push_back(i);
			while(D.size() and i - D.front() == sizex)
				D.pop_front();
			m1[i][j] = A[D.front()][j];
			}
		D.clear();}
	D.clear(); 
	for ( int i = 1; i <= n; ++i) {
		D.push_back(1);
		m2[i][1] = m1[i][1];
		for ( int j = 2; j <= sizey; ++j) {
			while(D.size() and m1[i][j] <= m1[i][D.back()] )
				D.pop_back();
			D.push_back(j);
			m2[i][j] = m1[i][D.front()];
			}
		
		for ( int j = sizey + 1; j <= m; ++j) {
			while ( D.size() and m1[i][j] <= m1[i][D.back()] )
				D.pop_back();
			D.push_back(j);
			while(D.size() and j - D.front() == sizey)
				D.pop_front();
			m2[i][j] = m1[i][D.front()];
			}
		D.clear();}
	for ( int i = sizex; i <= n; ++i)
		for ( int j = sizey; j <= m; ++j)
			if ( M2[i][j] - m2[i][j] < mi )
				mi = M2[i][j] - m2[i][j],nr = 1;
			else
				if ( M2[i][j] - m2[i][j] == mi)
					++nr;
}