Cod sursa(job #845764)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 31 decembrie 2012 15:17:39
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<fstream>
#include<string.h>
#define DIM 1010
using namespace std;

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

int i,j,n,m,u1,p1,u2,p2,Min[DIM][DIM],Max[DIM][DIM],Minim[DIM],Maxim[DIM],V[DIM][DIM],a,b,p,sol,vf,temp,nr;

void read(){
	f>>n>>m>>p;
	
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			f>>V[i][j];
	
}

int mod(int x){
	if(x<0)
		x*=(-1);
	return x;
}


void solve(int x, int y){
	for(i=1;i<=n;i++){
		p1=1;u1=1;p2=1;u2=1;vf=0;
		Minim[1]=1;Maxim[1]=1;
		for(j=2;j<=m;j++){
			while(V[i][j]<=V[i][Minim[u1]]&&u1>=p1)
				u1--;
			while(V[i][j]>=V[i][Maxim[u2]]&&u2>=p2)
				u2--;
			
			Minim[++u1]=j;
			Maxim[++u2]=j;
			
			if((j-Minim[p1])>=y)
				p1++;
			
			if((j-Maxim[p2])>=y)
				p2++;
			
			if(j>=y){
				Min[i][++vf]=V[i][Minim[p1]];
				Max[i][vf]=V[i][Maxim[p2]];
			}
		}
	}
	
	memset(Minim,0,sizeof(Minim));
	memset(Maxim,0,sizeof(Maxim));
	
	for(i=1;i<=vf;i++){
		p1=1;u1=1;p2=1;u2=1;
		Minim[1]=1;Maxim[1]=1;
		for(j=2;j<=n;j++){
			while(Min[j][i]<=Min[Minim[u1]][i]&&u1>=p1)
				u1--;
			while(Max[j][i]>=Max[Maxim[u2]][i]&&u2>=p2)
				u2--;
			
			Minim[++u1]=j;
			Maxim[++u2]=j;
			
			if((j-Minim[p1])>=x)
				p1++;
			if((j-Maxim[p2])>=x)
				p2++;
			
			if(j>=x){
				temp=mod(Min[Minim[p1]][i]-Max[Maxim[p2]][i]);
				if(temp<sol){
					sol=temp;
					nr=1;
				}
				else if(temp==sol)
					nr++;
			}
		}
	}
	
}


int main(){
	
	read();
	
	while(p--){
		f>>a>>b;
		sol=2000000000;
		solve(a,b);
		if(a!=b)
			solve(b,a);
		g<<sol<<" "<<nr;
		g<<"\n";
	}
	
	return 0;
}