Cod sursa(job #2631303)

Utilizator euyoTukanul euyo Data 29 iunie 2020 18:12:12
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.06 kb
#include <fstream>
#include <algorithm>
#define MAXN 100000

using namespace std;

struct segNode {
  int pref, suff, maxl;
};

segNode tree[4 * MAXN + 1];
int lazy[4 * MAXN + 1];

static inline int lSon( int node ) {
  return 2 * node;
}
static inline int rSon( int node ) {
  return 2 * node + 1;
}

void build( int node, int st, int dr ) {
  int mij = (st + dr) / 2;

  if ( st == dr ) {
	tree[node].maxl = tree[node].pref = tree[node].suff = 1;
	return;
  }
  build( lSon( node ), st, mij );
  build( rSon( node ), mij + 1, dr );
  tree[node].maxl = tree[lSon( node )].maxl + tree[rSon( node )].maxl;   
  tree[node].pref = tree[lSon( node )].pref + tree[rSon( node )].pref; 
  tree[node].suff = tree[lSon( node )].suff + tree[rSon( node )].suff; 
}

static inline void fix( int node, int ll, int lr ) {
  if ( tree[lSon( node )].pref == ll ) {
	tree[node].pref = ll + tree[rSon( node )].pref;
  } else {
	tree[node].pref = tree[lSon( node )].pref;
  }
  if ( tree[rSon( node )].suff == lr ) {
	tree[node].suff = lr + tree[lSon( node )].suff;
  } else {
	tree[node].suff = tree[rSon( node )].suff;
  }
  tree[node].maxl = max( max( tree[lSon( node )].maxl, tree[rSon( node )].maxl ), (tree[lSon( node )].suff + tree[rSon( node )].pref) ); 
}
static inline void prop( int node, int st, int dr ) {
  int mij = (st + dr) / 2;

  if ( lazy[node] ) {
	if ( lazy[node] == 1 ) {
      tree[lSon( node )].pref = tree[rSon( node )].pref = 0;
	  tree[lSon( node )].suff = tree[rSon( node )].suff = 0;
	  tree[lSon( node )].maxl = tree[rSon( node )].maxl = 0;
	  lazy[lSon( node )] = lazy[rSon( node )] = 1;
	} else {
      tree[lSon( node )].pref = mij - st + 1, tree[rSon( node )].pref = dr - mij;
      tree[lSon( node )].suff = mij - st + 1, tree[rSon( node )].suff = dr - mij;
	  tree[lSon( node )].maxl = mij - st + 1, tree[rSon( node )].maxl = dr - mij;
	  lazy[lSon( node )] = lazy[rSon( node )] = 2;
	}
  }
  lazy[node] = 0;
}

void update( int node, int st, int dr, int x, int y, int c ) {
  int mij = (st + dr) / 2;

  if ( c == 1 ) {
    if ( x <= st && dr <= y ) {
	  lazy[node] = c;
      tree[node].maxl = tree[node].pref = tree[node].suff = 0; 
	  return;
    }
	prop( node, st, dr );
    if ( x <= mij ) {
	  update( lSon( node ), st, mij, x, y, c );
	}
    if ( y > mij ) {
	  update( rSon( node ), mij + 1, dr, x, y, c );
	}
    fix( node, mij - st + 1, dr - mij );
  } else {
	if ( x <= st && dr <= y ) {
      lazy[node] = c;
	  tree[node].maxl = tree[node].pref = tree[node].suff = dr - st + 1;
      return;
	}
	prop( node, st, dr );
	if ( x <= mij ) {
	  update( lSon( node ), st, mij, x, y, c );
	}
	if ( y > mij ) {
	  update( rSon( node ), mij + 1, dr, x, y, c );
	}
	fix( node, mij - st + 1, dr - mij );
  }
}

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

int main() {
  int n, q, type, i, m;
   
  fin >> n >> q;
  build( 1, 1, n );    
  while ( q-- ) {
	 fin >> type;
	 switch ( type ) {
	 case 1:
	 case 2:
	   fin >> i >> m;
	   update( 1, 1, n, i, i + m - 1, type );
	   break;
	 case 3:
       fout << tree[1].maxl << "\n";
	   break;
	 }
  }
  fin.close();
  fout.close();
  return 0;
}