Cod sursa(job #544780)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 2 martie 2011 09:17:02
Problema Buline Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>
#include <limits.h>
#include <string.h>
FILE *f=fopen("buline.in","r");
FILE *g=fopen("buline.out","w");
int n;
int e[200001];
int s[200001];

int main(void){
	register int i;
	
	fscanf(f,"%d",&n);
	int s1,st=0;
	for(i=1;i<=n;i++){
		fscanf(f,"%d %d",&e[i],&s1);
		if(!s1){
			e[i]=0-e[i];
		}
		st+=e[i];
	}
	fclose(f);
	
	//determinam secventa de suma maxima cu P si U minime
	int smax=INT_MIN,p,u,pa=1;
	s[1]=e[1];
	for(i=2;i<=n;i++){
		if(s[i-1]+e[i]>e[i]){
			s[i]=s[i-1]+e[i];
			if(s[i]>smax){
				smax=s[i];
				p=pa;
				u=i;
			}
		}else{
			s[i]=e[i];
			pa=i;
			if(s[i]>smax){
				smax=s[i];
				p=pa;
				u=i;
			}
		}
	}
	
	//determinam secventa de lungime minima cu P1 SI U1 minime
	int smin=INT_MAX,p1,u1;
	pa=1;
	memset(s,0,sizeof(s));
	s[1]=e[1];
	for(i=2;i<=n;i++){
		if(s[i-1]+e[i]<e[i]){
			s[i]=s[i-1]+e[i];
			if(s[i]<smin){
				smin=s[i];
				p1=pa-1;
				u1=i+1;
			}
		}else{
			s[i]=e[i];
			pa=i;
			if(s[i]<smin){
				smin=s[i];
				p1=pa-1;
				u1=i+1;
			}
		}
	}
	
	if(st-smin>smax){
		fprintf(g,"%d %d ",st-smin,u1);
		fprintf(g,"%d",n-u1+1+p1);
	}
	else{
		fprintf(g,"%d %d %d",smax,p,u-p+1);
	}
	return 0;
}