Pagini recente » Cod sursa (job #1200268) | Cod sursa (job #1147512) | Cod sursa (job #769492) | Cod sursa (job #1490462) | Cod sursa (job #2636394)
#include <fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int a[400001], lazy[400001];
int p[400001], s[400001];
bool ok[400001]; //ok[i] = 1, daca nodul i contine numai 0
int qst, qdr, val;
inline void comb(int nod)
{
a[nod] = max(max(a[nod<<1], a[nod<<1|1]), s[nod<<1] + p[nod<<1|1]);
ok[nod] = ok[nod<<1] & ok[nod<<1|1];
if (ok[nod<<1])
p[nod] = a[nod<<1] + p[nod<<1|1];
else
p[nod] = p[nod<<1];
if (ok[nod<<1|1])
s[nod] = a[nod<<1|1] + s[nod<<1];
else
s[nod] = s[nod<<1|1];
}
void constr(int nod, int st, int dr)
{
if (st != dr)
{
int mij = (st+dr)>>1;
constr(nod<<1, st, mij);
constr(nod<<1|1, mij+1, dr);
}
a[nod] = p[nod] = s[nod] = dr-st+1;
ok[nod] = 1;
lazy[nod] = -1;
}
void update(int nod, int st, int dr)
{
int mij = (st+dr)>>1;
if (st != dr && lazy[nod] != -1)
{
lazy[nod<<1] = lazy[nod<<1|1] = lazy[nod];
if (lazy[nod] == 0)
{
a[nod<<1] = p[nod<<1] = s[nod<<1] = mij-st+1;
a[nod<<1|1] = p[nod<<1|1] = s[nod<<1|1] = dr-mij;
ok[nod<<1] = ok[nod<<1|1] = 1;
}
else
a[nod<<1] = a[nod<<1|1] = s[nod<<1] = s[nod<<1|1] = p[nod<<1] = p[nod<<1|1] = ok[nod<<1] = ok[nod<<1|1] = 0;
lazy[nod] = -1;
}
if (qst <= st && dr <= qdr)
{
lazy[nod] = val;
if (val == 0)
{
a[nod] = p[nod] = s[nod] = dr-st+1;
ok[nod] = 1;
}
else
a[nod] = p[nod] = s[nod] = ok[nod] = 0;
return;
}
if (qst <= mij)
update(nod<<1, st, mij);
if (mij < qdr)
update(nod<<1|1, mij+1, dr);
comb(nod);
}
int main()
{
int n, p, t, i;
fin >> n >> p;
constr(1, 1, n);
for (i = 1; i<=p; i++)
{
fin >> t;
if (t == 1)
{
fin >> qst >> qdr;
qdr = qst+qdr-1;
val = 1;
update(1, 1, n);
}
else if (t == 2)
{
fin >> qst >> qdr;
qdr = qst+qdr-1;
val = 0;
update(1, 1, n);
}
else
fout << a[1] << '\n';
}
return 0;
}