Cod sursa(job #2650406)

Utilizator BogdanTicuTicu Bogdan Valeriu BogdanTicu Data 18 septembrie 2020 17:45:31
Problema Struti Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <bits/stdc++.h>

using namespace std;

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

int mat[1001][1001],maxx[1001][1001],minn[1001][1001];
int ansmaxim[1001][1001];
int ansminim[1001][1001];
int deq1[1001],deq2[1001];
int ans,numElements;
int n,m;
void deque_linii(int x,int y)
{
	int c1,c2,l1,l2;
	for(int i=1;i<=n;i++)
	{
		c1=1;
		c2=1;
		l1=0;
		c2=0;
		for(int j=1;j<=m;j++)
		{
			while(l1>=c1 && mat[i][j]<mat[i][deq1[l1]])
				l1--;
			deq1[++l1]=j;
			if(j-deq1[c1]>=y) c1++;
			minn[i][j]=mat[i][deq1[c1]];
			while(l2>=c2 && mat[i][j]>mat[i][deq2[l2]])
				l2--;
			deq2[++l2]=j;
			if(j-deq2[c2]>=y) c2++;
			maxx[i][j]=mat[i][deq2[c2]];
		}
	}
}


void deque_coloane(int x,int y)
{
	int c1,c2,l1,l2;
	for(int j=y;j<=m;j++)
	{
		c1=1;
		c2=1;
		l1=0;
		l2=0;
		for(int i=1;i<=n;i++)
		{
			while(l1>=c1 && minn[i][j]<minn[deq1[l1]][j])
				l1--;
			deq1[++l1]=i;
			if(i-deq1[c1]>=x)
				c1++;
			ansminim[i][j]=minn[deq1[c1]][j];
			while(l2>=c2 && maxx[i][j]>maxx[deq2[l2]][j])
				l2--;
			deq2[++l2]=i;
			if(i-deq2[c2]>=x)
				c2++;
			ansmaxim[i][j]=maxx[deq2[c2]][j];
		}
		for(int i=x;i<=n;i++)
		{
			if(ansmaxim[i][j]-ansminim[i][j]<ans)
			{
				ans=ansmaxim[i][j]-ansminim[i][j];
				numElements=1;
			}
			else if(ansmaxim[i][j]-ansminim[i][j]==ans)
				numElements++;
		}
	}
}


int main()
{
	int p;
	in>>n>>m>>p;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			in>>mat[i][j];
	while(p--)
	{
	    ans=8001;
		numElements=0;
		int dx,dy;
		in>>dx>>dy;
		deque_linii(dx,dy);
		deque_coloane(dx,dy);
		if(dx!=dy)
		{
			deque_linii(dy,dx);
			deque_coloane(dy,dx);
		}
		out<<ans<<" "<< numElements<<"\n";
	}
	return 0;

}