Pagini recente » Cod sursa (job #102282) | Cod sursa (job #2737439) | Cod sursa (job #3215439) | Cod sursa (job #1186654) | Cod sursa (job #3148266)
#include <fstream>
#include <climits>
using namespace std;
ifstream f("ssm.in");
ofstream g("ssm.out");
int a[6000005];
int n;
struct ssm {
int sum, left, right;
};
ssm solve(int left, int right){
if(left == right){
return {a[left], left, right};
}
//divide et impera si aici avem cazurile cans secventa e in stanga sau in dreapta
int mid = (left + right) / 2;
ssm ans; //asta vom returna la final de tot
ssm valoareleft = solve(left, mid);
ssm valoareright = solve(mid + 1, right);
// aici cazul cand secventa se intinde pe ambele parti
int solutie = 0;
int suma = 0, maxsum = -INT_MAX, indice_stanga;
for(int st = mid; st >= left; st--){
suma += a[st];
if(suma > maxsum){
maxsum = suma;
indice_stanga = st;
}
}
solutie += maxsum;
maxsum = -INT_MAX;
suma = 0;
int indice_dreapta;
for(int dr = mid + 1; dr <= right; dr++){
suma += a[dr];
if(suma > maxsum){
maxsum = suma;
indice_dreapta = dr;
}
}
solutie += maxsum;
if(valoareleft.sum >= valoareright.sum){
ans = valoareleft;
}
else{
ans = valoareright;
}
if(solutie > ans.sum){
ans = {solutie, indice_stanga, indice_dreapta};
}
else if(solutie == ans.sum && (ans.left > indice_stanga || (ans.left == indice_stanga && ans.right > indice_dreapta))){
ans = {solutie, indice_stanga, indice_dreapta};
}
return ans;
}
int main(){
f >> n;
for(int i = 1; i <= n; i++){
f >> a[i];
}
ssm solutie = solve(1, n);
g << solutie.sum << solutie.left << solutie.right;
}