Pagini recente » Cod sursa (job #2200494) | Cod sursa (job #2586914) | Monitorul de evaluare | Cod sursa (job #2752525) | Cod sursa (job #3334642)
#include <fstream>
#include <climits>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream cin("buline.in");
ofstream cout("buline.out");
int main()
{
////declarare
long n, s, i, v[200000],start,sumatotala=0,semn,aux; //generale (end=i)
long smax,maxstart,maxend;//suma maxima
long smin,minstart,minend,minlenght;//suma minima
//citire
cin >> n;
for (i = 1; i <= n; i++)
{
cin >> v[i];
cin >> semn;
if (semn==0){
v[i]=-v[i];
}
sumatotala=sumatotala+v[i];
}
///////initializare
s = v[1];
smax = INT_MIN;
maxstart = 1;
maxend=1;
smin=INT_MAX;
minstart=1;
minend=1;
/////gasim suma maxima
for (i = 2; i <= n; i++)
{
if (s >= 0)
{
s = s + v[i];
}
else
{
s = v[i];
start = i;
}
if (s > smax)
{
smax = s;
maxend = i;
maxstart = start;
}
if ((s == smax) && (start <= maxstart) && (i - start < maxend - maxstart))
{
smax = s;
maxend = i;
maxstart = start;
}}
//gasim suma min
for (i = 2; i <= n; i++)
{
if (s <= 0)
{
s = s + v[i];
}
else
{
s = v[i];
start = i;
}
if (s < smin)
{
smin = s;
minend = i;
minstart = start;
}
if ((s == smin) && (start >= minstart) && (i - start > minend - minstart))
{
smin = s;
minend = i;
minstart = start;
}
}
minlenght=minend-minstart+1;
aux=minstart;
minstart=minend+1;
minend=aux-1;
////// compararea si afisarea
if (sumatotala-smin>smax){
cout << sumatotala-smin<<" "<<minstart<<" "<<n-minlenght;
}
if (sumatotala-smin<smax){
cout << smax<<" "<<maxstart<<" "<<maxend-maxstart+1;
}
if (sumatotala-smin==smax){
if (minstart<maxstart){
cout << sumatotala-smin<<" "<<minstart<<" "<<n-minlenght;
}
if (minstart>maxstart){
cout << smax<<" "<<maxstart<<" "<<maxend-maxstart+1;
}
if (minstart==maxstart){
if (maxend - maxstart < n-minlenght){
cout << smax<<" "<<maxstart<<" "<<maxend-maxstart+1;
}
else cout << sumatotala-smin<<" "<<minstart<<" "<<n-minlenght;
}
}
}