Cod sursa(job #2824386)

Utilizator mircea_007Mircea Rebengiuc mircea_007 Data 2 ianuarie 2022 00:16:42
Problema Subsecventa de suma maxima Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <stdio.h>
#include <ctype.h>

#define MAXN 6'000'000

class ReadOnSteroids {
  protected:
    static const int BUFSIZE = (128 * 1024);
    FILE *fin;
    char ibuf[BUFSIZE];
    int ibp = BUFSIZE - 1;
    bool close;

  public:
    ReadOnSteroids( char *fname ){
      fin = fopen( fname, "r" );
      close = true;
    }
    
    ReadOnSteroids( FILE *fp ){
      fin = fp;
      close = false;
    }
    
    ~ReadOnSteroids(){
      if( close )
        fclose( fin );
    }

    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wunused-result"
    
    inline char getch(){
      if( (ibp = ((ibp + 1) & (BUFSIZE - 1))) == 0 )
        fread( ibuf, sizeof(char), BUFSIZE, fin );
     return ibuf[ibp];
    }
    
    #pragma GCC diagnostic pop

    template<typename T> inline T getnum(){
      T n = 0;
      char ch, semn = 1;
      
      while( isspace( ch = getch() ) );
      if( ch == '-' ){
        ch = getch();
        semn = -1;
      }
      do
        n = n * 10 + ch - '0';
      while( isdigit( ch = getch() ) );
      
      return n * semn;
    }
};

int main(){
  ReadOnSteroids fin( (char *)"ssm.in" );
  FILE *fout = fopen("ssm.out", "w");

  int n, i, max, max_sum_i, start, max_start, max_end;
  
  n = fin.getnum<int>();
  max = max_sum_i = 0;
  max_start = max_end = start = 0;
  for( i = 0 ; i < n ; i++ ){
    if( max_sum_i < 0 ){
      start = i;
      max_sum_i = fin.getnum<int>();
    }else
      max_sum_i += fin.getnum<int>();
    
    if( max_sum_i > max ){
      max_start = start;
      max_end = i;
      max = max_sum_i;
    }
  }
  
  fprintf(fout, "%d %d %d\n", max, max_start + 1, max_end + 1);
  
  fclose(fout);
  return 0;
}