Pagini recente » Cod sursa (job #2531034) | Cod sursa (job #780086) | Cod sursa (job #2249988) | Cod sursa (job #2609073) | Cod sursa (job #3262599)
#include <fstream>
#define int long long
using namespace std;
ifstream cin("hotel.in");
ofstream cout("hotel.out");
struct node
{
int maxim, st, dr;
int lazy;
};
node tree[800005];
void propagation(int node, int st, int dr)
{
if(tree[node].lazy != 0)
{
int val=0;
if(tree[node].lazy == -1)
{
val=dr-st+1;
}
tree[node].st=val;
tree[node].dr=val;
tree[node].maxim=val;
if(st != dr)
{
tree[node*2+1].lazy=tree[node].lazy;
tree[node*2+2].lazy=tree[node].lazy;
}
tree[node].lazy=0;
}
}
void update(int node, int st, int dr, int qst, int qdr, bool added) // added true => se cazeaza; false => pleaca
{
// prop
propagation(node, st, dr);
if(dr < qst || qdr < st)
{
return;
}
if(qst <= st && dr <= qdr)
{
// prop
int val=0;
if(!added)
val=dr-st+1;
tree[node].st=val;
tree[node].dr=val;
tree[node].maxim=val;
int val0=-1;
if(added)
val0=1;
if(st != dr)
{
tree[node*2+1].lazy=val0;
tree[node*2+2].lazy=val0;
}
return;
}
int mid=(st+dr)/2;
update(node*2+1, st, mid, qst, qdr, added);
update(node*2+2, mid+1, dr, qst, qdr, added);
tree[node].maxim=max(tree[node*2+1].dr+tree[node*2+2].st, max(tree[node*2+1].maxim, tree[node*2+2].maxim));
tree[node].st=tree[node*2+1].st;
if(tree[node*2+1].st == mid-st+1) // e tot nodul
tree[node].st+=tree[node*2+2].st;
tree[node].dr=tree[node*2+2].dr;
if(tree[node*2+2].dr == dr-mid) // e tot nodul
tree[node].dr+=tree[node*2+1].dr;
}
int32_t main()
{
int n, q;
cin>>n>>q;
for(int i=1; i<=n; i++)
{
update(0, 1, n, i, i, false);
}
int c, i, m;
while(q--)
{
cin>>c;
// i - m+i-1
if(c == 1)
{
cin>>i>>m;
update(0, 1, n, i, m+i-1, true);
}
if(c == 2)
{
cin>>i>>m;
update(0, 1, n, i, m+i-1, false);
}
if(c == 3)
{
cout<<tree[0].maxim<<'\n';
}
}
return 0;
//multumesc turcavid
}