Cod sursa(job #2453733)

Utilizator alex.cojocaruAlex Cojocaru alex.cojocaru Data 5 septembrie 2019 15:58:56
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <iostream>

#define NMAX 100000
#define INFINIT 100001

using namespace std;

struct Node {
  int pref ;
  int suf ;
  int ssm ;
  int s ;
};

struct Aint {
  Node aint [ 4 * NMAX + 1 ] ;
  Aint (int n) {
    for (int i = 0 ; i <= n ; i++ )
      this->aint[i] = {-INFINIT, -INFINIT, -INFINIT, -INFINIT} ;
  }
  Node join (Node node1, Node node2 ) {
    Node rez ;
    rez.s = node1.s + node2.s ;
    rez.ssm = max ( node1.suf + node2.pref, max(node1.ssm, node2.ssm)) ;
    rez.pref = max ( node1.s + node2.pref, node1.pref) ;
    rez.suf = max ( node2.suf, node2.s + node1.suf ) ;
    return rez ;
  }
  void update (int node, int st, int dr, int poz, int val ) {
    if (poz < st || poz > dr )
      return ;
    else {
      if (st == dr )
        this->aint[node] = {val, val, val, val} ;
      else {
        int mij = (st + dr ) / 2 ;
        update (2*node,   st, mij, poz, val ) ;
        update (2*node+1, mij+1, dr, poz, val ) ;
        aint[node] = join(this->aint[2*node], this->aint[2*node+1]) ;
      }
    }
  }
  Node query (int node, int st, int dr, int left, int right) {
    if (right < st || left > dr )
      return {-INFINIT, -INFINIT, -INFINIT, -INFINIT} ;
    else {
      if (st >= left && dr <= right ) {
        return aint[node] ;
      }
      else {
        int mij = ( st + dr ) / 2 ;
        return this->join(query(2 * node, st, mij, left, dr), query(2*node+1, mij+1, dr, left, right)) ;
      }
    }
  }
};

int v [ NMAX + 1 ] ;
Aint a(NMAX) ;

int main() {

  FILE *fin, *fout ;
  fin = fopen ("sequencequery.in", "r" ) ;
  fout = fopen ("sequencequery.out", "w" ) ;
  int n, i, m, st, dr ;
  fscanf (fin, "%d%d", &n, &m ) ;
  for (i = 1 ; i <= n ; i++) {
    fscanf (fin, "%d", &v[i] ) ;
    a.update(1, 1, n, i, v[i] ) ;
  }
  for (i = 1 ; i <= m ; i++ ) {
    fscanf (fin, "%d%d", &st, &dr ) ;
    fprintf (fout, "%d\n", a.query(1, 1, n, st, dr).ssm ) ;
  }
  return 0;
}