Cod sursa(job #214990)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 17 octombrie 2008 11:47:53
Problema Buline Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.19 kb
#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();
}