Pagini recente » Monitorul de evaluare | Istoria paginii runda/ion/clasament | Cod sursa (job #2010082) | Istoria paginii runda/wellcodesimulare4martie-special/clasament | Cod sursa (job #2326972)
#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;
}