Pagini recente » Cod sursa (job #2932305) | Cod sursa (job #2417216) | Cod sursa (job #524000) | Cod sursa (job #775237) | Cod sursa (job #612332)
Cod sursa(job #612332)
#include<stdio.h>
#include<limits.h>
#define N 6000005
struct secv {
int start;
int end;
int sum;
};
int A[N];
int n;
void read() {
freopen("ssm.in","r",stdin);
freopen("ssm.out","w",stdout);
scanf("%d",&n);
for(int i = 1; i <= n; i++)
scanf("%d",&A[i]);
}
secv convertSecv(int start, int end, int sum) {
secv aux;
aux.start = start;
aux.end = end;
aux.sum = sum;
return aux;
}
secv combine(int st, int end) {
int mid = (st + end) / 2;
int pozleft = mid;
int pozright = mid + 1;
int i = mid;
int j = mid + 1;
int sumleft = 0;
int maxleft = LONG_MIN;
int sumright = 0;
int maxright = LONG_MIN;
while(i >= st) {
sumleft += A[i];
if (maxleft <= sumleft) {
maxleft = sumleft;
pozleft = i;
}
i--;
}
while(j <= end) {
sumright += A[j];
if (maxright < sumright) {
maxright = sumright;
pozright = j;
}
j++;
}
return convertSecv(pozleft, pozright, maxleft + maxright);
}
secv solve(int st, int end) {
if (st != end) {
int mid = (st + end) / 2;
secv left = solve(st, mid);
secv right = solve(mid + 1, end);
secv comb = combine(st, end);
if ((left.sum >= right.sum) && (left.sum >= comb.sum)) return left;
else
if ((comb.sum >= left.sum) && (comb.sum >= right.sum)) return comb;
else
return right;
/* if ((left.sum == comb.sum) && (left.sum >= right.sum)) {
if (left.start < comb.start) {
return left;
}
else
if ((left.start == comb.start) && (left.end < comb.end)) {
return left;
}
else
return comb;
}
else
if ((right.sum == comb.sum) && (right.sum >= left.sum)) {
if (right.start < comb.start) {
return right;
}
else
if ((right.start == comb.start) && (right.end < comb.end)) {
return right;
}
else
return comb;
}
else
return left;*/
}
else {
secv m = convertSecv(st, end, A[st]);
return m;
}
}
void writeresult(secv x) {
printf("%d %d %d", x.sum, x.start, x.end);
}
int main() {
secv result;
read();
result = solve(1, n);
writeresult(result);
}