Cod sursa(job #2673826)

Utilizator Andrei1Mariciuc Andrei-Alexandru Andrei1 Data 17 noiembrie 2020 20:28:19
Problema Subsecventa de suma maxima Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

void generateIndex(int *a, int n) {
  for(int i=0; i<n; i++)
    for(int j=i+1; j<n; j++)
      cout << i << " " << j << "\n";//faci suma si iese treaba!O(n^2) nu e o solutie prea buna!
}

typedef pair<pair<int, int>, int>  pereche;

pereche cautaIntre(int* a, int left, int mij, int right) {
  int sumLeft = a[mij];
  int indexLeft = mij;
  int sum = sumLeft;
  for(int i=mij-1; i>=0; i--) {
    sum += a[i];
    if(sum > sumLeft)
      sumLeft = sum, indexLeft = i;
  }

  int sumRight = a[mij+1];
  int indexRight = mij+1;
  sum = sumRight;
  for(int i=mij+2; i<=right; i++) {
    sum += a[i];
    if(sum > sumRight)
      sumRight = sum, indexRight = i;
  }
  return {{indexLeft, indexRight}, sumLeft + sumRight};
}

pereche findMaxSubarray(int* a, int left, int right) {
  if(left == right)
    return {{left, right}, a[left]};
  else {
        int mij = (left + right) / 2;
        pereche p1 = findMaxSubarray(a, left, mij);
        pereche p2 = findMaxSubarray(a, mij+1, right);
        pereche p3 = cautaIntre(a, left, mij, right);
        if(p1.second >= p2.second and p1.second >= p3.second)
          return p1;
        else if(p3.second >= p1.second and p3.second >= p2.second)
            return p3;
        else
            return p2;
  }
}

int main() {
  freopen("ssm.in", "r", stdin);
  freopen("ssm.out", "w", stdout);
  int n;
  cin >> n;
  int a[n];
  for(int i=0; i<n; i++)
    cin >> a[i];
  //generateIndex(a, n);
  pereche p = findMaxSubarray(a, 0, n-1);
  cout << p.second << " " << p.first.first+1 << " " << p.first.second+1;
  return 0;
}