Pagini recente » Cod sursa (job #1747614) | Cod sursa (job #1365870) | Cod sursa (job #2566531) | Cod sursa (job #113332) | Cod sursa (job #1336742)
#include <fstream>
#include <vector>
using namespace std;
ifstream is("hotel.in");
ofstream os("hotel.out");
using VI = vector<int>;
int n, m;
int lt, rt, val;
VI t, s, d;
void Build(int nod, int st, int dr);
void Update(int nod, int st, int dr);
void Push(int nod, int st, int dr);
int main()
{
is >> n >> m;
s = VI(4 * n);
d = VI(4 * n);
t = VI(4 * n);
Build(1, 1, n);
int tip, v;
while ( m-- )
{
is >> tip;
if ( tip < 3 )
{
is >> lt >> v;
rt = lt + v - 1;
if ( tip == 1 )
val = 0;
else
val = 1;
Update(1, 1, n);
}
else
os << t[1] << "\n";
}
is.close();
os.close();
return 0;
}
void Push(int nod, int st, int dr)
{
if ( !t[nod] )
{
t[2 * nod] = s[2 * nod] = d[2 * nod] = 0;
t[2 * nod + 1] = s[2 * nod + 1] = d[2 * nod + 1] = 0;
}
else
if ( t[nod] == dr - st + 1 )
{
int md = ( st + dr ) / 2;
t[2 * nod] = s[2 * nod] = d[2 * nod] = md - st + 1;
t[2 * nod + 1] = s[2 * nod + 1] = d[2 * nod + 1] = dr - md;
}
}
void Update(int nod, int st, int dr)
{
if ( lt <= st && dr <= rt )
{
s[nod] = d[nod] = t[nod] = ( dr - st + 1 ) * val;
return;
}
if ( st == dr )
return;
Push(nod, st, dr);
int md = ( st + dr ) / 2;
if ( lt <= md )
Update(2 * nod, st, md);
if ( md < rt )
Update(2 * nod + 1, md + 1, dr);
s[nod] = s[2 * nod];
if ( s[2 * nod] == md - st + 1 )
s[nod] += s[2 * nod + 1];
d[nod] = d[2 * nod + 1];
if ( d[2 * nod + 1] == dr - md )
d[nod] += d[2 * nod];
t[nod] = max(d[2 * nod] + s[2 * nod + 1], max(t[2 * nod], t[2 * nod + 1]));
}
void Build(int nod, int st, int dr)
{
if ( st == dr )
{
t[nod] = s[nod] = d[nod] = 1;
return;
}
int md = ( st + dr ) / 2;
Build(2 * nod, st, md);
Build(2 * nod + 1, md + 1, dr);
t[nod] = s[nod] = d[nod] = s[2 * nod] + s[2 * nod + 1];
}