Cod sursa(job #3135970)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 4 iunie 2023 21:31:05
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
//Ilie Dumitru
#include<cstdio>
#include<deque>
const int NMAX=1024;
const int VALMAX=8192;

int N, M;
int mat[NMAX][NMAX], minim[NMAX][NMAX], maxim[NMAX][NMAX], m[NMAX];
int min, nrMin;
std::deque<int> dq;

void calc(int a, int b)
{
	int i, j, x;

	for(i=0;i<N;++i)
	{
		for(j=0;j<M;++j)
		{
			while(!dq.empty() && mat[i][dq.back()]>mat[i][j])
				dq.pop_back();
			dq.push_back(j);
			if(dq.front()==j-b)
				dq.pop_front();
			minim[i][j]=mat[i][dq.front()];
		}
		dq.clear();
		for(j=0;j<M;++j)
		{
			while(!dq.empty() && mat[i][dq.back()]<mat[i][j])
				dq.pop_back();
			dq.push_back(j);
			if(dq.front()==j-b)
				dq.pop_front();
			maxim[i][j]=mat[i][dq.front()];
		}
		dq.clear();
	}

	for(j=b-1;j<M;++j)
	{
		for(i=0;i<N;++i)
		{
			while(!dq.empty() && minim[dq.back()][j]>minim[i][j])
				dq.pop_back();
			dq.push_back(i);
			if(dq.front()==i-a)
				dq.pop_front();
			m[i]=minim[dq.front()][j];
		}
		dq.clear();
		for(i=0;i<N;++i)
		{
			while(!dq.empty() && maxim[dq.back()][j]<maxim[i][j])
				dq.pop_back();
			dq.push_back(i);
			if(dq.front()==i-a)
				dq.pop_front();
			if(i>=a-1)
			{
				if((x=maxim[dq.front()][j]-m[i])<min)
					min=x, nrMin=1;
				else if(x==min)
					++nrMin;
			}
		}
		dq.clear();
	}
}

int main()
{
	FILE* f=fopen("struti.in", "r"), *g=fopen("struti.out", "w");
	int i, j, _, a, b;

	fscanf(f, "%d%d%d", &N, &M, &_);
	for(i=0;i<N;++i)
		for(j=0;j<M;++j)
			fscanf(f, "%d", mat[i]+j);
	do
	{
		fscanf(f, "%d%d", &a, &b);
		min=VALMAX;
		nrMin=0;

		calc(a, b);
		if(a!=b)
			calc(b, a);

		fprintf(g, "%d %d\n", min, nrMin);
	}while(--_);

	fclose(f);
	fclose(g);
	return 0;
}