Cod sursa(job #569618)

Utilizator Robert29FMI Tilica Robert Robert29 Data 1 aprilie 2011 20:55:59
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
#include<fstream>
using namespace std;
#define dim 1001
ifstream fi("struti.in");
ofstream fo("struti.out");
int l1,l2,f1,f2,nr,minim,a[dim][dim],b[dim][dim],d1[dim],d2[dim],n,m,k,i,j,x,y,c[dim][dim];
int main(){
	fi>>n>>m>>k;
	for(i=1;i<=n;++i)
		for(j=1;j<=m;++j)
			fi>>a[i][j];
	for(i=1;i<=n;++i)
		b[i][1]=c[i][1]=a[i][1];
	for(int o=1;o<=k;++o){
		fi>>x>>y;
		nr=0;
		minim=9000;
		
		for(i=1;i<=n;++i){
			d1[1]=d2[1]=l1=l2=f1=f2=1;
			for(j=2;j<=m;++j){
				
				while(l1>=f1&&a[i][d1[l1]]>=a[i][j])
					l1--;
				d1[++l1]=j;
				while(d1[f1]+x<=j)
					f1++;
				
				while(l2>=f2&&a[i][d2[l2]]<=a[i][j])
					l2--;
				d2[++l2]=j;
				while(d2[f2]+x<=j)
					f2++;
				
				b[i][j]=a[i][d2[f2]];
				c[i][j]=a[i][d1[f1]];
			}
		}
		
		for(j=x;j<=m;++j){
			
			d2[1]=l2=f2=d1[1]=l1=f1=1;
			for(i=2;i<=n;++i){
				
				while(l1>=f1&&c[d1[l1]][j]>=c[i][j])
					l1--;
				d1[++l1]=i;
				while(d1[f1]+y<=i)
					f1++;
				
				while(l2>=f2&&b[d2[l2]][j]<=b[i][j])
					l2--;
				d2[++l2]=i;
				while(d2[f2]+y<=i)
					f2++;
				if(i>=y)
					if(minim>b[d2[f2]][j]-c[d1[f1]][j]){
						minim=b[d2[f2]][j]-c[d1[f1]][j];
						nr=1;
					}else if(minim==b[d2[f2]][j]-c[d1[f1]][j])
						nr++;
				
			}
		}
		if(x!=y){
			for(i=1;i<=n;++i){
				d1[1]=d2[1]=l1=l2=f1=f2=1;
				for(j=2;j<=m;++j){
					
					while(l1>=f1&&a[i][d1[l1]]>=a[i][j])
						l1--;
					d1[++l1]=j;
					while(d1[f1]+y<=j)
						f1++;
					
					while(l2>=f2&&a[i][d2[l2]]<=a[i][j])
						l2--;
					d2[++l2]=j;
					while(d2[f2]+y<=j)
						f2++;
					
					b[i][j]=a[i][d2[f2]];
					c[i][j]=a[i][d1[f1]];
				}
			}
			
			for(j=y;j<=m;++j){
				
				d2[1]=l2=f2=d1[1]=l1=f1=1;
				for(i=2;i<=n;++i){
					
					while(l1>=f1&&c[d1[l1]][j]>=c[i][j])
						l1--;
					d1[++l1]=i;
					while(d1[f1]+x<=i)
						f1++;
					
					while(l2>=f2&&b[d2[l2]][j]<=b[i][j])
						l2--;
					d2[++l2]=i;
					while(d2[f2]+x<=i)
						f2++;
					if(i>=x)
						if(minim>b[d2[f2]][j]-c[d1[f1]][j]){
							minim=b[d2[f2]][j]-c[d1[f1]][j];
							nr=1;
						}else if(minim==b[d2[f2]][j]-c[d1[f1]][j])
							nr++;
						
				}
			}
		}
		
		fo<<minim<<' '<<nr<<'\n';
		
	}		
	
	
	fo.close();
	fi.close();
	return 0;
}