Cod sursa(job #2417811)

Utilizator alex.cojocaruAlex Cojocaru alex.cojocaru Data 1 mai 2019 15:37:55
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <iostream>

#define NMAX 100000
#define MMAX 200000

using namespace std;

struct elem {
  int ssm ;
  int prefix ;
  int sufix ;
  int lazy ;
};

elem aint [ 4 * NMAX + 1 ] ;

void push_lazy (int nod, int st, int dr ) {
  if (aint[nod].lazy != 0 ) {
    int mid = (st + dr ) / 2 ;
    if (aint[nod].lazy == 1 ) {
      aint[2*nod].ssm = aint[2*nod].prefix = aint[2*nod].sufix = mid - st + 1 ;
      aint[2*nod+1].ssm = aint[2*nod+1].prefix = aint[2*nod+1].sufix = dr - mid ;
    }
    else if (aint[nod].lazy == -1 ){
      aint[2*nod].ssm = aint[2*nod].prefix = aint[2*nod].sufix = -1 ;
      aint[2*nod+1].ssm = aint[2*nod+1].prefix = aint[2*nod+1].sufix = -1 ;
    }
    aint[2*nod].lazy = aint[2*nod+1].lazy = aint[nod].lazy ;
    aint[nod].lazy = 0 ;
  }
}

elem join (elem nod1, elem nod2, int st, int dr ) {
  elem nod ;
  nod.prefix = nod1.prefix ;
  nod.sufix = nod2.sufix ;
  int mid = ( st + dr ) / 2 ;
  if (nod1.prefix == mid - st + 1 )
    nod.prefix += nod2.prefix ;
  if (nod2.sufix == dr - mid  )
    nod.sufix += nod1.sufix ;
  nod.ssm = max ( max ( max (nod1.ssm, nod2.ssm), max (nod.prefix, nod.sufix) ), nod1.sufix+nod2.prefix ) ;
  nod.lazy = 0 ;
  return nod ;
}

void update (int nod, int st, int dr, int left, int right, int val ) {
  push_lazy(nod, st, dr ) ;
  if (st > left || dr < right )
    return ;
  else {
    if (left <= st && dr <= right ) {
      if (val == 1)
        aint[nod].ssm = aint[nod].prefix = aint[nod].sufix = dr - st + 1 ;
      else
        aint[nod].ssm = aint[nod].prefix = aint[nod].sufix = -1 ;
      aint[nod].lazy = val ;
    }
    else {
      int mid = (st + dr ) / 2 ;
      update (2 * nod,       st, mid, left, right, val ) ;
      update (2 * nod + 1, mid+1, dr, left, right, val ) ;
      aint[nod] = join (aint[2*nod], aint[2*nod+1], st, dr ) ;
    }
  }
  push_lazy(nod, st, dr ) ;
}

int main() {

  FILE *fin, *fout ;
  fin = fopen ("hotel.in", "r" ) ;
  fout = fopen ("hotel.out", "w" ) ;
  int n, i, m, tip, a, b ;
  fscanf (fin, "%d%d", &n, &m ) ;
  update (1, 1, n, 1, n, 1 ) ;
  for (i = 0 ; i < m ; i++ ) {
    fscanf (fin, "%d", &tip ) ;
    switch (tip) {
      case 1 : {
        fscanf (fin, "%d%d", &a, &b ) ;
        update (1, 1, n, a, a+b-1, -1 ) ;
        break ;
      }
      case 2 : {
        fscanf (fin, "%d%d", &a, &b ) ;
        update (1, 1, n, a, a+b-1, 1 ) ;
        break ;
      }
      case 3 : {
        fprintf (fout, "%d\n", aint[1].ssm ) ;
        break ;
      }
    }
  }
  return 0 ;
}