Pagini recente » Cod sursa (job #2924851) | Cod sursa (job #3127280) | Cod sursa (job #166889) | Cod sursa (job #1030609) | Cod sursa (job #1208803)
#include <fstream>
#include <cstring>
using namespace std;
ifstream is("hotel.in");
ofstream os("hotel.out");
int N, M, x, y, z, X, P1, P2, MAX;
struct T
{
int a;
int b;
int c;
};
T Arb[400001];
void Build(int,int,int);
void Update(int,int,int,int);
void Update2(int);
int main()
{
is >> N >> M;
for ( int i = 1; i <= N; ++i )
{
X = i;
Build(1,1,N);
}
for ( int i = 1; i <= M; ++i )
{
is >> x;
if ( x == 1 )
{
is >> y >> z;
P1 = y;
P2 = y+z-1;
Update(1,1,N,1);
}
if ( x == 2 )
{
is >> y >> z;
P1 = y;
P2 = y+z-1;
Update(1,1,N,2);
}
if ( x == 3 )
os << Arb[1].c << '\n';
}
is.close();
os.close();
}
void Build(int node, int left, int right)
{
if ( node > MAX)
MAX = node;
Arb[node].c = right-left+1;
Arb[node].a = right-left+1;
Arb[node].b = right-left+1;
int mid = (left+right)/2;
if ( left == right ) return;
Build(node*2,left,mid);
Build(node*2+1,mid+1,right);
}
void Update(int node, int left, int right, int type)
{
if ( left >= P1 && right <= P2 )
{
if ( type == 1 )
{
Arb[node].a = 0;
Arb[node].b = 0;
Arb[node].c = 0;
Update2(node);
}
if ( type == 2 )
{
Arb[node].a = right-left+1;
Arb[node].b = right-left+1;
Arb[node].c = right-left+1;
}
return;
}
int mid = (left+right)/2;
if ( P1 <= mid ) Update(2*node,left,mid,type);
if ( P2 > mid ) Update(2*node+1,mid+1,right,type);
Arb[node].a = Arb[node*2].a;
if ( Arb[node*2].a == mid-left+1 )
Arb[node].a += Arb[node*2+1].a;
Arb[node].b = Arb[node*2+1].b;
if ( Arb[node*2+1].b == right-mid )
Arb[node].b += Arb[node*2].b;
Arb[node].c = max(max(max(Arb[node*2].c,Arb[node*2+1].c),max(Arb[node].a,Arb[node].b)),Arb[node*2].b+Arb[node*2+1].a);
}
void Update2(int node)
{
if ( node > MAX )
return;
Arb[node].c = 0;
Arb[node].a = 0;
Arb[node].b = 0;
Update2(node*2);
Update2(node*2+1);
}