Cod sursa(job #2273429)

Utilizator sandupetrascoPetrasco Sandu sandupetrasco Data 31 octombrie 2018 15:41:33
Problema Subsecventa de suma maxima Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#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;
}