Cod sursa(job #2916404)

Utilizator euyoTukanul euyo Data 29 iulie 2022 16:48:14
Problema Subsecventa de suma maxima Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin( "ssm.in" );
ofstream fout( "ssm.out" );

const int MAXN = 6e6 + 1;
const int INF = 1e9; 

struct ssm {
  int val, l, r, pref, suff, p, s;
};

int v[MAXN];
int S[MAXN];

inline void upd( ssm &crt, ssm now ) {
  if ( crt.val < now.val ) {
	crt = now;
  } else if ( crt.val == now.val && crt.l > now.l ) {
	crt = now;
  } else if ( crt.val == now.val && crt.l == now.l && crt.r > now.r ) {
	crt = now;
  }
}

ssm getBest( int st, int dr ) {
  if ( st == dr ) return {v[st], st, st, v[st], v[st], st, st};
  int mid = (st + dr) / 2;
  ssm X = getBest( st, mid );
  ssm Y = getBest( mid + 1, dr );
  ssm res = {-INF, 0, 0, 0, 0, 0, 0};
  
  upd(res, X);
  upd(res, Y);
  upd(res, {X.suff + Y.pref, X.s, Y.p, 0, 0, 0, 0});

  if ( X.pref >= S[mid] - S[st - 1] + Y.pref ) {
	res.pref = X.pref;
	res.p = X.p;
  } else {
	res.pref = S[mid] - S[st - 1] + Y.pref;
	res.p = Y.p;
  }
  if ( Y.suff > S[dr] - S[mid] + X.suff ) {
	res.suff = Y.suff;
	res.s = Y.s;
  } else {
	res.suff = S[dr] - S[mid] + X.suff;
	res.s = X.s;
  } 
  return res;
}

int main() {
  int n;

  fin >> n;
  for ( int i = 1; i <= n; ++i ) {
	fin >> v[i];
    S[i] = S[i-1] + v[i];
  }
  ssm res = getBest(1, n);
  fout << res.val << " " << res.l << " " << res.r;
  fin.close();
  fout.close();
  return 0;
}