Pagini recente » Cod sursa (job #2069623) | Cod sursa (job #2660457) | Cod sursa (job #753127) | Cod sursa (job #3241955) | Cod sursa (job #2239106)
#include <bits/stdc++.h>
using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");
const int NMAX = 1e5+1;
struct arb
{
int Left,Right,Best,Lazy;
} tree[4*NMAX];
int x,y,type;
void value(int node, int st, int dr)
{
int mj = (st+dr)/2;
tree[node].Best = max(max(tree[2*node].Best,tree[2*node+1].Best),tree[2*node].Right+tree[2*node+1].Left);
tree[node].Left = tree[2*node].Left+tree[2*node+1].Left*(tree[2*node].Left == mj-st+1);
tree[node].Right = tree[2*node+1].Right+tree[2*node].Right*(tree[2*node+1].Right == dr-mj);
}
void build(int node, int st, int dr)
{
if (st == dr)
tree[node].Left = tree[node].Right = tree[node].Best = 1;
else
{
int mj = (st+dr)/2;
build(2*node,st,mj);
build(2*node+1,mj+1,dr);
value(node,st,dr);
}
}
void propagate(int node, int st, int dr)
{
if (!tree[node].Lazy || st == dr)
return;
int mj = (st+dr)/2;
if (tree[node].Lazy == 1)
{
tree[2*node].Left = tree[2*node].Right = tree[2*node].Best = 0;
tree[2*node+1].Left = tree[2*node+1].Right = tree[2*node+1].Best = 0;
}
else if (tree[node].Lazy == 2)
{
tree[2*node].Left = tree[2*node].Right = tree[2*node].Best = mj-st+1;
tree[2*node+1].Left = tree[2*node+1].Right = tree[2*node+1].Best = dr-mj;
}
tree[2*node].Lazy = tree[2*node+1].Lazy = tree[node].Lazy;
tree[node].Lazy = 0;
}
void update(int node, int st, int dr)
{
propagate(node,st,dr);
if (x<=st && dr<=y)
{
tree[node].Lazy = type;
if (type == 1)
tree[node].Left = tree[node].Right = tree[node].Best = 0;
else
tree[node].Left = tree[node].Right = tree[node].Best = dr-st+1;
}
else
{
int mj = (st+dr)/2;
if (x<=mj)
update(2*node,st,mj);
if (mj<y)
update(2*node+1,mj+1,dr);
value(node,st,dr);
}
}
int main()
{
int n,m;
in >> n >> m;
build(1,1,n);
for (int i = 1; i<=m; i++)
{
int t;
in >> t;
if (t == 1)
{
in >> x >> y;
y = x+y-1;
type = 1;
update(1,1,n);
}
else if (t == 2)
{
in >> x >> y;
y = x+y-1;
type = 2;
update(1,1,n);
}
else
out << tree[1].Best << "\n";
}
}