Cod sursa(job #2633843)

Utilizator andreic06Andrei Calota andreic06 Data 8 iulie 2020 20:38:21
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <iostream>
#include <fstream>

using namespace std;
const int N = 1e5;
struct node {
      int ans, pre, suf;
} segm_tree[4*N];

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

void build_tree ( int node, int left, int right ){
    if ( left == right )
      segm_tree[node].ans = segm_tree[node].pre = segm_tree[node].suf = 1;
    else {
      int mid = left + ( right - left ) / 2;
      build_tree ( 2 * node + 1, left, mid );
      build_tree ( 2 * node + 2, mid + 1, right );
      segm_tree[node].ans =
      segm_tree[node].pre =
      segm_tree[node].suf =
      segm_tree[2*node+1].ans + segm_tree[2*node+2].ans;
    }
}


void update ( int node, int left, int right, int x, int y, int lazy_value ) {
    if ( x <= left && right <= y )
      segm_tree[node].ans = segm_tree[node].pre = segm_tree[node].suf = lazy_value * ( right - left + 1 );
    else {
      int mid = left + ( right - left ) / 2;
      /// intervalul actual [left,right] nu face parte integral parte din [x, y]
      if ( segm_tree[node].ans == ( 1 - lazy_value ) * ( right - left + 1 ) ) /// o sa avem nevoie de fiii lui care poate nu au fost up-to-date
        segm_tree[2*node+1].ans = segm_tree[2*node+1].pre = segm_tree[2*node+1].suf = ( 1 - lazy_value ) * ( mid - left + 1 ),
        segm_tree[2*node+2].ans = segm_tree[2*node+2].pre = segm_tree[2*node+2].suf = ( 1 - lazy_value ) * ( right - mid );

      if ( x <= mid )
        update ( 2 * node + 1, left, mid, x, y, lazy_value );
      if ( y >= mid + 1 )
        update ( 2 * node + 2, mid + 1, right, x, y, lazy_value );

      if ( segm_tree[2*node+1].ans == mid - left + 1 )
        segm_tree[node].pre = segm_tree[2*node+1].ans + segm_tree[2*node+2].pre;
      else
        segm_tree[node].pre = segm_tree[2*node+1].pre;
      if ( segm_tree[2*node+2].ans == right - mid )
        segm_tree[node].suf = segm_tree[2*node+2].ans + segm_tree[2*node+1].suf;
      else
        segm_tree[node].suf = segm_tree[2*node+2].suf;
      segm_tree[node].ans = max ( segm_tree[2*node+1].ans, segm_tree[2*node+2].ans );
      segm_tree[node].ans = max ( segm_tree[node].ans, segm_tree[2*node+1].suf + segm_tree[2*node+2].pre );
    }
}

int main()
{
   int n, q;
   fin >> n >> q;
   build_tree ( 0, 1, n );

   for ( int i = 1; i <= q; i ++ ) {
      int tip, x, y;
      fin >> tip;
      if ( tip == 3 ) {
        fout << segm_tree[0].ans << '\n';
      }
      else {
        tip --;
        fin >> x >> y;
        update ( 0, 1, n, x, x + y - 1, tip );
      }
   }
    return 0;
}