Cod sursa(job #253084)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 5 februarie 2009 13:46:37
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <stdio.h>
#include <string>
#define M 1024
#define N 1001
struct per{short int min,max;};
short int n,m,Q,sol,nrsol,Smin[M],Smax[M],Pmin[M],Pmax[M],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]);
}
int main(){
	read();
  register short int k;
	for (k=1;k<=Q;++k){
		register short int i,j,p,q,st,dr,L,U;
		L=dx[k]; U=dy[k];
		//deque pe linii
		for (i=1;i<=n;++i){
			 p=1;q=0; st=1;dr=0;
			 for (j=1;j<=m;++j){
					//minimul
					while (q>=p && a[i][j]<Smin[q])q--;
					q++; Smin[q]=a[i][j]; Pmin[q]=j;
					while (p<q && Pmin[p]+U <= j)p++;
					//maximul
					while (dr>=st && a[i][j]>Smax[dr])dr--;
					dr++; Smax[dr]=a[i][j];Pmax[dr]=j;
					while (st<dr && Pmax[st]+U <= j)st++;
					if (j>=U){deq1[i][j].min=Smin[p]; deq1[i][j].max=Smax[st];}
			 }
		}
		//deque pe coloane
		for (j=U;j<=m;++j){
			 p=1;q=0; st=1;dr=0;
		   for (i=1;i<=n;++i){
					//minimul
					while (q>=p && deq1[i][j].min<Smin[q])q--;
					q++; Smin[q]=deq1[i][j].min; Pmin[q]=j;
					while (p<q && Pmin[p]+L <= j)p++;
					//maximul
					while (dr>=st && deq1[i][j].max>Smax[dr])dr--;
					dr++; Smax[dr]=deq1[i][j].max;Pmax[dr]=j;
					while (st<dr && Pmax[st]+L <= j)st++;
					if (i>=L){deq2[i][j].min=Smin[p];deq2[i][j].max=Smax[st];}
			 }
	  }
		sol=10000;
		for (i=L;i<=n;++i)
			 for (j=U;j<=m;++j){
					q=deq2[i][j].max-deq2[i][j].max;
				  if (q<sol){sol=q;nrsol=1;}
					else if (q==sol)nrsol++;
			 }
	 printf("%d %d\n",sol,nrsol);
 }
return 0;
}