Cod sursa(job #253119)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 5 februarie 2009 14:26:17
Problema Struti Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <stdio.h>
#include <string>
#define M 1024
#define N 1001
struct per{short int min,max;};
struct stiva{short int v,p;};
short int n,m,k,Q,sol,nrsol,dx[12],dy[12];
short int a[N][M];
per deq1[N][M],deq2[N][M];

void read(){
  freopen("struti.in","r",stdin);freopen("struti.out","w",stdout);
	short int i,j,k,l;
	scanf("%d %d %d\n",&n,&m,&Q);
	char ch[5005];
	for (i=1;i<=n;++i){
		gets(ch); l=strlen(ch); ch[l]=' '; k=0;
		for (j=1;j<=m;++j){
			short int x=0;
		  while (ch[k]!=' '){x=x*10+ch[k]-'0';k++;}
			a[i][j]=x;k++;
	  }
	}
	for (i=1;i<=Q;++i)scanf("%d %d",&dx[i],&dy[i]);
}
inline void solve(register short int L, register short int U){
	register short int i,j,p,q,st,dr,x;
	stiva Smin[M],Smax[M];
	//deque pe linii
	for (i=1;i<=n;++i){
		p=1;q=0; st=1;dr=0;
		for (j=1;j<=m;++j){
			x=a[i][j];
			//minimul
			while (q>=p && x < Smin[q].v)q--;
			Smin[++q].v=x; Smin[q].p=j;
			while (p<q && Smin[p].p+U <= j)p++;
			//maximul
			while (dr>=st && x > Smax[dr].v)dr--;
			Smax[++dr].v=x; Smax[dr].p=j;
			while (st<dr && Smax[st].p+U <= j)st++;
			if (j>=U){deq1[i][j].min=Smin[p].v; deq1[i][j].max=Smax[st].v;}
		}
		//for (j=U;j<=m;++j)printf("%d ",deq1[i][j].max);
		//printf("\n");
	}
	//deque pe coloane
	for (j=U;j<=m;++j){
  	p=1;q=0; st=1;dr=0;
		for (i=1;i<=n;++i){
			x=deq1[i][j].min;
			//minimul
			while (q>=p && x < Smin[q].v)q--;
			Smin[++q].v=x; Smin[q].p=i;
			while (p<q && Smin[p].p+L <= i)p++;
			//maximul
			x=deq1[i][j].max;
			while (dr>=st && x > Smax[dr].v)dr--;
			Smax[++dr].v=x; Smax[dr].p=i;
			while (st<dr && Smax[st].p+L <= i)st++;
			if (i>=L){deq2[i][j].min=Smin[p].v;deq2[i][j].max=Smax[st].v;}
		}
		/*for (i=L;i<=n;++i)printf("%d ",deq2[i][j].min);
		printf("\n");*/
	}
	//solutie
	for (i=L;i<=n;++i)
	  for (j=U;j<=m;++j){
			q=deq2[i][j].max-deq2[i][j].min;
		  if (q<sol){sol=q;nrsol=1;}
			else if (q==sol)nrsol++;
	 }
}
int main(){
	read();
	for (k=1;k<=Q;++k){
		sol=10000;
		solve(dx[k],dy[k]);
		if(dx[k]!=dy[k]) solve(dy[k],dx[k]);
	  printf("%d %d\n",sol,nrsol);
  }
return 0;
}