Pagini recente » Cod sursa (job #1635953) | Istoria paginii runda/p1-66/clasament | Cod sursa (job #1739018) | Cod sursa (job #1453522) | Cod sursa (job #1604217)
#include <iostream>
#include <stdio.h>
using namespace std;
const int MIN = 0x80000000;
void divide(int *v, int low, int up, int &start, int &stop, int &s) {
if(low == up) {
if(v[low] > s) {
s = v[low];
start = stop = low;
}
return;
}
int mij = (low + up) / 2;
divide(v, low, mij, start, stop, s);
divide(v, mij+1, up, start, stop, s);
int l = MIN, r = MIN;
int sl = 0, sr = 0;
int left, right;
for(int i = mij; i >= low; i--) {
sl += v[i];
if(sl > l) {
l = sl;
left = i;
}
}
for(int i = mij + 1; i <= up; i++) {
sr += v[i];
if(sr > r) {
r = sr;
right = i;
}
}
if(r + l > s) {
s = r + l;
start = left;
stop = right;
}
}
int main()
{
FILE *f;
int n;
if( (f = fopen("ssm.in", "r")) == NULL) {
return 0;
}
fscanf(f, "%d", &n);
int v[n];
for(int i = 0; i < n; i++) {
fscanf(f, "%d", &v[i]);
}
int b, e, s = MIN;
divide(v, 0, n-1, b, e, s);
b++;
e++;
fclose(f);
if( (f = fopen("ssm.out", "w")) == NULL) {
return 0;
}
fprintf(f, "%d %d %d", s, b, e);
fclose(f);
return 0;
}