Pagini recente » Cod sursa (job #3174594) | Cod sursa (job #3237923) | Cod sursa (job #3197333) | Cod sursa (job #524598) | Cod sursa (job #3266517)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 6000001;
pair<int,int> dp[NMAX]; /// dp[i] secventa care se termina in i de suma maxima si care incepe la dp[i].second
int32_t main(void){
ofstream cout("ssm.out");
ifstream cin("ssm.in");
int n,x;
cin >> n >> x;
dp[1].first = 1;
dp[1].first = x; /// cazul de baza in care am o singura posibila solutie
for(int i= 2;i <= n;i++){
cin >> x;
if(dp[i - 1].first + x > x){
dp[i].second = dp[i-1].second;
dp[i].first = dp[i-1].first + x;
}else{
// suntem mult mai avantajati daca incepem o noua subsecventa
dp[i].second = i;
dp[i].first = x;
}
}
int maxim = -2e9, left = 0, right= 0 ;;
for(int i = 1;i <= n;i++){
if(maxim < dp[i].first){
maxim = dp[i].first;
left = dp[i].second;
right = i;
}
if(maxim == dp[i].first){
/// acum practic trebuie sa l luam pe cel mai scurt
}
}
cout << maxim << ' ' << left << ' ' << right;
}