Pagini recente » Cod sursa (job #915175) | Cod sursa (job #2549297) | Cod sursa (job #330287) | Cod sursa (job #2184116) | Cod sursa (job #3288837)
#include <iostream>
using namespace std;
const int mxN = 1e5;
struct info{int libere = 0, prefix = 0, suffix = 0,flag = 0;}A[4*mxN+1];
void build(int node, int st, int dr)
{
if(st == dr)
{
A[node].libere = 1;
A[node].prefix = 1;
A[node].suffix = 1;
A[node].flag = 0;
return;
}
int mid = (st + dr) / 2;
build(2*node,st,mid);
build(2*node+1,mid+1,dr);
A[node].libere = A[2*node].libere + A[2*node+1].libere;
A[node].prefix = A[2*node].prefix;
if(A[node].prefix == mid - st + 1)
A[node].prefix+=A[2*node+1].prefix;
A[node].suffix = A[2*node+1].suffix;
if(A[node].suffix == dr - mid)
A[node].suffix+=A[2*node].suffix;
A[node].flag = 0;
}
void update(int node, int st, int dr, int a, int b, int val)
{
if(a<=st && dr <= b)
{
if(val == 1)
{
A[node].libere = 0;
A[node].prefix = 0;
A[node].suffix = 0;
A[node].flag = 1; // se ocupa intreaga portiune
}
if(val == 0)
{
A[node].libere = dr - st + 1;
A[node].prefix = dr - st + 1;
A[node].suffix = dr - st + 1;
A[node].flag = 2; // se elibereaza intreaga portiune.
}
return;
}
int mid = (st + dr) / 2;
if(A[node].flag == 1)
{
A[2*node].flag = 1;
A[2*node+1].flag = 1;
A[2*node].flag = 0;
A[2*node].libere = 0;
A[2*node+1].libere = 0;
A[2*node].suffix = A[2*node+1].suffix = 0;
A[2*node].prefix = A[2*node+1].prefix = 0;
}
if(A[node].flag == 2)
{
A[2*node].flag = 2;
A[2*node+1].flag = 2;
A[2*node].flag = 0;
A[2*node].libere = mid - st + 1;
A[2*node+1].libere = dr - mid;
A[2*node].suffix = mid - st + 1;
A[2*node+1].suffix = dr - mid;
A[2*node].prefix = mid - st + 1;
A[2*node+1].prefix = dr - mid;
}
if(a<=mid)
update(2*node, st, mid, a, b, val);
if(b > mid)
update(2*node+1,mid+1,dr,a,b,val);
/// Now the fun part, to combine the two.
// Find the prefix for A[node]
A[node].prefix = A[2*node].prefix;
if(A[2*node].prefix == mid - st + 1)
A[node].prefix+=A[2*node+1].prefix;
// Find the suffix for A[node]
A[node].suffix = A[2*node+1].suffix;
if(A[2*node+1].suffix == dr - mid)
A[node].suffix+=A[2*node+1].suffix;
// Now find the required thing lol
A[node].libere = max(A[2*node].libere, A[2*node+1].libere);
A[node].libere = max(A[2*node].libere, A[2*node].suffix + A[2*node+1].prefix);
return;
}
int main()
{
int n , m ;
cin >> n >> m;
build(1,1,n);
for(int i = 1;i<=m;i++)
{
int op;
cin >> op;
if(op == 1) /// marcam ca fiind ocupate
{
int poz, marime;
cin >> poz >> marime;
update(1,1,n,poz,poz + marime - 1, 1);
}
if(op == 2)
{
int poz,marime;
cin >> poz >> marime;
update(1,1,n,poz,poz+marime-1,0);
}
if(op == 3)
{
cout << A[1].libere << '\n';
}
}
return 0;
}