Pagini recente » Cod sursa (job #1513873) | Cod sursa (job #2144649) | Cod sursa (job #1404837) | Cod sursa (job #395259) | Cod sursa (job #2273429)
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#define MOD 2011
using namespace std;
typedef long long ll;
typedef pair< ll , ll > PII;
ll n, a[6001000], sol = LLONG_MIN;
int idx1, idx2;
int pozr;
char buffer[1010];
FILE *fi, *fo;
char getch(){
if( pozr == 1010 ){
fread( buffer, 1010, 1, fi );
pozr = 0;
}
return buffer[ pozr++ ];
}
int scano(){
int nr = 0, sign = 1;
char ch = getch();
while( isdigit(ch) == 0 && ch != '-')
ch = getch();
if (ch == '-'){
sign = -1;
ch = getch();
}
while( isdigit(ch) != 0 ){
nr = nr * 10 + ch - '0';
ch = getch();
}
return nr * sign;
}
void divide(int st, int dr){
if (st > dr) return ;
if (st == dr){
if (a[st] > sol){
sol = a[st];
idx1 = idx2 = st;
}else if (a[st] == sol){
if (st < idx1){
idx1 = st, idx2 = st;
}else if (st == idx1 && st < idx2){
idx1 = st, idx2 = st;
}
}
return ;
}
int mid = (st + dr) >> 1;
divide(st, mid); divide(mid + 1, dr);
ll d1 = a[mid], d2 = a[mid + 1];
ll sum1 = d1, sum2 = d2;
int pos1 = mid, pos2 = mid + 1;
for (int i = mid - 1; i >= st; i--){
sum1 += a[i];
if (d1 < sum1) d1 = sum1, pos1 = i;
else if (d1 == sum1 && i < pos1) pos1 = i;
}
for (int i = mid + 2; i <= dr; i++){
sum2 += a[i];
if (d2 < sum2) d2 = sum2, pos2 = i;
else if (d2 == sum2 && i < pos2) pos2 = i;
}
if (d1 + d2 > sol){
sol = d1 + d2;
idx1 = pos1, idx2 = pos2;
}else if (d1 + d2 == sol){
if (pos1 < idx1){
idx1 = pos1, idx2 = pos2;
}else if (pos1 == idx1 && pos2 < idx2){
idx1 = pos1, idx2 = pos2;
}
}
}
int main(){
fi = fopen("ssm.in", "r");
fo = fopen("ssm.out", "w");
n = scano();
for (int i = 1; i <= n; i++){
a[i] = scano();
}
divide(1, n);
fprintf(fo, "%lld %d %d", sol, idx1, idx2);
return 0;
}