Cod sursa(job #1732746)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 22 iulie 2016 15:02:06
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <cstdio>
#include <algorithm>
#include <deque>
#define INF 2000000000
#define MaxN 1001
using namespace std;

int N,M,P,X1,X2,v[MaxN][MaxN]={},MaxL[MaxN][MaxN]={},MaxC[MaxN][MaxN]={},MinL[MaxN][MaxN]={},MinC[MaxN][MaxN]={},Min,cnt;
deque <int> Qmax;
deque <int> Qmin;
void Solve(int v1,int v2)
{
	for(int i=1;i<=N;i++)
	{
		Qmin.clear();
		Qmax.clear();
		for(int j=1;j<=M;j++)
		{
			while(!Qmax.empty()&&v[i][Qmax.back()]<v[i][j])
				Qmax.pop_back();
			Qmax.push_back(j);
			if(Qmax.front()<=j-v1)
				Qmax.pop_front();
			if(j-v1>=0)
				MaxL[i][j-v1+1]=v[i][Qmax.front()];
			while(!Qmin.empty()&&v[i][Qmin.back()]>v[i][j])
				Qmin.pop_back();
			Qmin.push_back(j);
			if(Qmin.front()<=j-v1)
				Qmin.pop_front();
			if(j-v1>=0)
				MinL[i][j-v1+1]=v[i][Qmin.front()];
		}
	}
	for(int j=1;j<=M-v1+1;j++)
	{
		Qmin.clear();
		Qmax.clear();
		for(int i=1;i<=N;i++)
		{
			while(!Qmax.empty()&&MaxL[Qmax.back()][j]<MaxL[i][j])
				Qmax.pop_back();
			Qmax.push_back(i);
			if(Qmax.front()<=i-v2)
				Qmax.pop_front();
			if(i-v2>=0)
				MaxC[i-v2+1][j]=MaxL[Qmax.front()][j];
			while(!Qmin.empty()&&MinL[Qmin.back()][j]>MinL[i][j])
				Qmin.pop_back();
			Qmin.push_back(i);
			if(Qmin.front()<=i-v2)
				Qmin.pop_front();
			if(i-v2>=0)
				MinC[i-v2+1][j]=MinL[Qmin.front()][j];
		}
	}
	for(int i=1;i<=N-v2+1;i++)
		for(int j=1;j<=M-v1+1;j++)
			if(Min>MaxC[i][j]-MinC[i][j])
				Min=MaxC[i][j]-MinC[i][j],cnt=1;
			else if(Min==MaxC[i][j]-MinC[i][j])
				cnt++;
}
int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
	scanf("%d%d%d",&N,&M,&P);
	for(int i=1;i<=N;i++)
		for(int j=1;j<=M;j++)
			scanf("%d",&v[i][j]);
	for(int step=1;step<=P;step++)
	{
		scanf("%d%d",&X1,&X2);
		Min=INF,cnt=0;
		Solve(X1,X2);
		if(X1!=X2) Solve(X2,X1);
		printf("%d %d\n",Min,cnt);
	}
	return 0;
}