Pagini recente » Cod sursa (job #2000753) | Cod sursa (job #2222699) | Cod sursa (job #2796850) | Cod sursa (job #1464495) | Cod sursa (job #214990)
Cod sursa(job #214990)
#include <stdio.h>
#include <stdlib.h>
#define N 200010
#define FIN "buline.in"
#define FOUT "buline.out"
int v[N];
int n;
void scan(void){
int i,j;
char s[32],type;
freopen(FIN,"r",stdin);
freopen(FOUT,"w",stdout);
gets(s);
for (i=0;s[i]>='0' && s[i]<='9';++i)
n=n*10+s[i]-'0';
for (j=1;j<=n;++j){
gets(s);
for (i=0;s[i]>='0' && s[i]<='9';++i)
v[j]=v[j]*10+s[i]-'0';
++i;
type=s[i]-'0';
//fprintf(stderr,"%d\n",type);
if (type==0)
v[j]*=-1;
}
}
inline int max(int a,int b){
if (a>b)
return a;
return b;
}
int sum[N],t[N];
typedef struct sol sol;
struct sol{
int sum,a,b;
};
sol s1,s2,s3;
#define INF -15000
int lung[N];
void solve(void){
int i;
// getting sum
for (i=1;i<=n;++i)
sum[i]=sum[i-1]+v[i];
// getting t
t[1]=0;lung[1]=0;
for (i=2;i<=n;++i){
if (t[i-1]>sum[i-1]){
t[i]=t[i-1];
lung[i]=lung[i-1];
}
else{
t[i]=sum[i-1];
lung[i]=i-1;
}
}
// getting s2
s2.a=n+1;
s2.b=n+1;
s2.sum=INF;
s3.a=1;
s3.b=0;
for (i=1;i<=n;++i){
s3.sum+=v[i];
++s3.b;
if (s3.sum>s2.sum)
s2=s3;
if (s3.sum<0){
s3.sum=0;
s3.a=i+1;
s3.b=i;
}
}
// getting s1
for (i=1;i<=n;++i){
if (t[i]+sum[n]-sum[i-1]>s1.sum){
s1.sum=t[i]+sum[n]-sum[i-1];
s1.a=i;
s1.b=lung[i]+n-i+1;
}
}
s2.b-=(s2.a-1);
}
void print(void){
int i;
if (s1.sum>s2.sum)
printf("%d %d %d\n",s1.sum,s1.a,s1.b);
else if (s1.sum<s2.sum)
printf("%d %d %d\n",s2.sum,s2.a,s2.b);
else{
if (s1.a<s2.a)
printf("%d %d %d\n",s1.sum,s1.a,s1.b);
else if (s1.a>s2.a)
printf("%d %d %d\n",s2.sum,s2.a,s2.b);
else{
if (s1.b<s2.b)
printf("%d %d %d\n",s1.sum,s1.a,s1.b);
else
printf("%d %d %d\n",s2.sum,s2.a,s2.b);
}
}
fclose(stdin);
fclose(stdout);
exit(0);
}
int main(void){
scan();
solve();
print();
}