Cod sursa(job #2530025)

Utilizator alex2209alexPavel Alexandru alex2209alex Data 24 ianuarie 2020 12:04:44
Problema Struti Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.65 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
//------------------------------------
///Globale
short n,m,v[1001][1001],raspuns,raspuns2,nr,v2[1001][1001],v3[1001][1001];
deque<pair<short,short>>dq[1001],dq2,dq3;
//------------------------------------
///Functii
void citire();
//------------------------------------
int main()
{
	citire();
	return 0;
}
//------------------------------------
void afisare()
{
	g << raspuns << " " << raspuns2 << '\n';
}
//------------------------------------
void calculare_raspuns(short c)
{
	for(short i = 1; i <= nr; ++i)
	{
		dq2.clear();
		dq3.clear();
		for(short j = 1; j <= c; ++j)
		{
			while(!dq2.empty() && v2[i][j] < dq2.back().first)
				dq2.pop_back();
			dq2.push_back({v2[i][j],j});
			while(!dq3.empty() && v3[i][j] > dq3.back().first)
				dq3.pop_back();
			dq3.push_back({v3[i][j],j});
		}
		short r = dq3.front().first - dq2.front().first;
		if(r < raspuns)
		{
			raspuns = r;
			raspuns2 = 1;
		}
		else if(r == raspuns)
			raspuns2++;
		for(int j = c + 1; j <= m; ++j)
		{
			while(!dq2.empty() && v2[i][j] < dq2.back().first)
				dq2.pop_back();
			dq2.push_back({v2[i][j],j});
			while(!dq3.empty() && v3[i][j] > dq3.back().first)
				dq3.pop_back();
			dq3.push_back({v3[i][j],j});
			if(dq2.front().second == j - c)
				dq2.pop_front();
			if(dq3.front().second == j - c)
				dq3.pop_front();
			short r = dq3.front().first - dq2.front().first;
			if(r < raspuns)
			{
				raspuns = r;
				raspuns2 = 1;
			}
			else if(r == raspuns)
				raspuns2++;
		}
	}
}
//------------------------------------
void calculare_maxim_pe_linii(short l)
{
	nr = 0;
	for(short i = 1; i <= m; ++i)
		dq[i].clear();
	for(short j = 1; j <= m; ++j)
		for(short i = 1; i <= l; ++i)
		{
			while(!dq[j].empty() && v[i][j] > dq[j].back().first)
				dq[j].pop_back();
			dq[j].push_back({v[i][j],i});
		}
	nr++;
	for(short j = 1; j <= m; ++j)
		v3[nr][j] = dq[j].front().first;
	for(short i = l + 1; i <= n; ++i)
	{
		nr++;
		for(short j = 1; j <= m; ++j)
		{
			while(!dq[j].empty() && v[i][j] > dq[j].back().first)
				dq[j].pop_back();
			dq[j].push_back({v[i][j],i});
			if(dq[j].front().second == i - l)
				dq[j].pop_front();
			v3[nr][j] = dq[j].front().first;
		}
	}
}
//------------------------------------
void calculare_minim_pe_linii(short l)
{
	nr = 0;
	for(short i = 1; i <= m; ++i)
		dq[i].clear();
	for(short j = 1; j <= m; ++j)
		for(short i = 1; i <= l; ++i)
		{
			while(!dq[j].empty() && v[i][j] < dq[j].back().first)
				dq[j].pop_back();
			dq[j].push_back({v[i][j],i});
		}
	nr++;
	for(short j = 1; j <= m; ++j)
		v2[nr][j] = dq[j].front().first;
	for(short i = l + 1; i <= n; ++i)
	{
		nr++;
		for(short j = 1; j <= m; ++j)
		{
			while(!dq[j].empty() && v[i][j] < dq[j].back().first)
				dq[j].pop_back();
			dq[j].push_back({v[i][j],i});
			if(dq[j].front().second == i - l)
				dq[j].pop_front();
			v2[nr][j] = dq[j].front().first;
		}
	}
}
//------------------------------------
void rezolvare(short l,short c)
{
	if(l <= n && c <= m)
	{
		calculare_minim_pe_linii(l);
		calculare_maxim_pe_linii(l);
		calculare_raspuns(c);
	}
	if(l == c)
		return;
	swap(l,c);
	if(l <= n && c <= m)
	{
		calculare_minim_pe_linii(l);
		calculare_maxim_pe_linii(l);
		calculare_raspuns(c);
	}
}
//------------------------------------
void citire()
{
	short p;
	f >> n >> m >> p;
	for(short i = 1; i <= n; ++i)
		for(short j = 1; j <= m; ++j)
			f >> v[i][j];
	while(p--)
	{
		raspuns = 8001;
		raspuns2 = 0;
		short l,c;
		f >> l >> c;
		rezolvare(l,c);
		afisare();
	}
}