Cod sursa(job #2326972)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 24 ianuarie 2019 12:08:53
Problema Hotel Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <bits/stdc++.h>
#define maxn 100000
#define maxt 200000
#define maxl2 17

using namespace std;

struct da
{
  int ls, ld, lmax, len, st, dr, ind;
};

vector <da> qu;
set <int,greater<int> > qu2;
da aint[maxn*maxl2+5];
int lst[maxn+5];

void pb ( int s, int d, int i )
{
  if ( s <= d )
  {
    da x;
    x.st = s; x.dr = d; x.ind = i; x.ls = x.ld = x.lmax = 0; x.len = d - s + 1;
    qu.push_back ( x );
  }
  if ( s == d )
    lst[s] = i;
}

void flip ( int a, int b )
{
  qu2.clear();
  int nn, i;
  for ( i = a; i <= b; i++ )
  {
    nn = lst[i];
    aint[nn].lmax = 1 - aint[nn].lmax;
    aint[nn].ls = 1 - aint[nn].ls;
    aint[nn].ld = 1 - aint[nn].ld;
    qu2.insert ( nn/2 );
  }

  while ( qu2.size() > 0 )
  {
    nn = *qu2.begin();
    qu2.erase ( qu2.begin() );
    aint[nn].ls = aint[2*nn].ls;
    aint[nn].ld = aint[2*nn+1].ld;

    if ( aint[nn].ls + aint[nn].ld >= aint[nn].len )
      aint[nn].ls = aint[nn].ld = aint[nn].len;
    if ( aint[2*nn+1].ls == aint[2*nn+1].len )
      aint[nn].ld = aint[2*nn].ld + aint[2*nn+1].len;
    if ( aint[2*nn].ld == aint[2*nn].len )
      aint[nn].ls = aint[2*nn].len + aint[2*nn+1].ls;

    aint[nn].lmax = max(aint[2*nn].ld + aint[2*nn+1].ls, max(aint[2*nn].lmax, aint[2*nn+1].lmax));
    if ( nn > 1 )
      qu2.insert ( nn/2 );
  }
}

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

  int n, t;
  fin >> n >> t;

  int lo = 0, mid;
  da nod;
  pb ( 1, n, 1 );
  while ( lo < qu.size() )
  {
    nod = qu[lo];
    aint[qu[lo].ind] = nod;
    if ( nod.st < nod.dr )
    {
      mid = ( nod.st + nod.dr ) / 2;
      pb ( nod.st, mid, qu[lo].ind * 2 );
      pb ( mid + 1, nod.dr, qu[lo].ind * 2 + 1 );
    }
    lo++;
  }

  int id, a, b;
  flip ( 1, n );
  while (t--)
  {
    fin >> id;
    if ( id <= 2 )
    {
      fin >> a >> b;
      flip ( a, a + b - 1 );
    }
    else
      fout << aint[1].lmax << '\n';
  }

  fin.close ();
  fout.close ();

  return 0;
}