Pagini recente » Cod sursa (job #2498338) | Cod sursa (job #810600) | Cod sursa (job #1969694) | Cod sursa (job #454250) | Cod sursa (job #2554361)
#include <bits/stdc++.h>
#define NUM 100005
struct nod
{
int lazy, ls, ld, lmax;
};
nod a[4 * NUM];
int n, p, c, S, D;
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
void build(int nod, int st, int dr)
{
if(st == dr)
{
a[nod].ls = a[nod].ld = a[nod].lmax = 1;
return;
}
int mij = st + ((dr - st) >> 1);
build((nod << 1), st, mij);
build((nod << 1) + 1, mij + 1, dr);
a[nod].ls = a[nod].ld = a[nod].lmax = dr - st + 1;
}
void update(int nod, int st, int dr)
{
if(a[nod].lazy == 1)
{
a[nod].ls = a[nod].ld = a[nod].lmax = 0;
if(st != dr)
a[(nod << 1)].lazy = a[(nod << 1) + 1].lazy = 1;
a[nod].lazy = -1;
}
else if(a[nod].lazy == 0)
{
a[nod].ls = a[nod].ld = a[nod].lmax = dr - st + 1;
if(st != dr)
a[(nod << 1)].lazy = a[(nod << 1) + 1].lazy = 0;
a[nod].lazy = -1;
}
if(st > D || dr < S)
return;
if(S <= st && dr <= D)
{
if(c == 1)
{
a[nod].ls = a[nod].ld = a[nod].lmax = 0;
if(st != dr)
a[(nod << 1)].lazy = a[(nod << 1) + 1].lazy = 1;
}
else
{
a[nod].ls = a[nod].ld = a[nod].lmax = dr - st + 1;
if(st != dr)
a[(nod << 1)].lazy = a[(nod << 1) + 1].lazy = 0;
}
return;
}
int mij = st + ((dr - st) >> 1);
update((nod << 1), st, mij);
update((nod << 1) + 1, mij + 1, dr);
a[nod].lmax = max(a[(nod << 1)].lmax, max(a[(nod << 1) + 1].lmax, a[(nod << 1)].ld + a[(nod << 1) + 1].ls));
a[nod].ls = (a[(nod << 1)].lmax == mij - st + 1) ? a[(nod << 1)].lmax + a[(nod << 1) + 1].ls : a[(nod << 1)].ls;
a[nod].ld = (a[(nod << 1) + 1].lmax == dr - mij) ? a[(nod << 1) + 1].lmax + a[(nod << 1)].ld : a[(nod << 1) + 1].ld;
}
int main()
{
f >> n >> p;
build(1, 1, n);
for(int i = 0; i < p; ++i)
{
f >> c;
if(c == 3)
g << a[1].lmax << '\n';
else
{
f >> S >> D;
D = S + D - 1;
update(1, 1, n);
}
}
f.close();
g.close();
}