Pagini recente » Cod sursa (job #2069300) | Cod sursa (job #1149924) | Cod sursa (job #2306694) | Cod sursa (job #351928) | Cod sursa (job #2525058)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct Aint
{
int ans,left,right,viz;
}aint[400005];
void update(int node, int l, int r, int lc, int rc, int val)
{
if(lc <= l && rc >= r)
{
aint[node].viz = 1;
if(val == 1)
aint[node].left = aint[node].right = aint[node].ans = 0;
else
aint[node].left = aint[node].right = aint[node].ans = r - l + 1;
return;
}
int mij = (l + r) / 2;
if(aint[node].viz == 1)
{
aint[node].viz = 0;
if(aint[node].ans == 0)
{
aint[2*node].ans = aint[2*node].left = aint[2*node].right = 0;
aint[2*node + 1].ans = aint[2*node + 1].left = aint[2*node + 1].right = 0;
}
else
{
aint[2*node].ans = aint[2*node].left = aint[2*node].right = mij - l + 1;
aint[2*node + 1].ans = aint[2*node + 1].left = aint[2*node + 1].right = r - mij;
}
aint[2*node].viz = aint[2*node + 1].viz = 1;
}
if(lc <= mij)
update(2*node, l, mij, lc, rc, val);
if(rc > mij)
update(2*node + 1, mij + 1, r, lc, rc, val);
aint[node].ans = max(max(aint[2*node].ans, aint[2*node + 1].ans),
aint[2*node].right + aint[2*node + 1].left);
aint[node].left = aint[2*node].left;
aint[node].right = aint[2*node + 1].right;
if(aint[node].left == mij - l + 1)
aint[node].left += aint[2*node + 1].left;
if(aint[node].right == r - mij)
aint[node].right += aint[2*node].right;
}
int main()
{
int n, p;
fin >> n >> p;
update(1, 1, n, 1, n, 2);
for(int i = 1; i <= p; i++)
{
int op, x, y;
fin >> op;
if(op == 3)
fout << aint[1].ans << '\n';
else
{
fin >> x >> y;
update(1, 1, n, x, y + x - 1, op);
}
}
return 0;
}