Pagini recente » Cod sursa (job #2890146) | Cod sursa (job #2768542) | Cod sursa (job #3221197) | Cod sursa (job #299489) | Cod sursa (job #2633843)
#include <iostream>
#include <fstream>
using namespace std;
const int N = 1e5;
struct node {
int ans, pre, suf;
} segm_tree[4*N];
ifstream fin ( "hotel.in" );
ofstream fout ( "hotel.out" );
void build_tree ( int node, int left, int right ){
if ( left == right )
segm_tree[node].ans = segm_tree[node].pre = segm_tree[node].suf = 1;
else {
int mid = left + ( right - left ) / 2;
build_tree ( 2 * node + 1, left, mid );
build_tree ( 2 * node + 2, mid + 1, right );
segm_tree[node].ans =
segm_tree[node].pre =
segm_tree[node].suf =
segm_tree[2*node+1].ans + segm_tree[2*node+2].ans;
}
}
void update ( int node, int left, int right, int x, int y, int lazy_value ) {
if ( x <= left && right <= y )
segm_tree[node].ans = segm_tree[node].pre = segm_tree[node].suf = lazy_value * ( right - left + 1 );
else {
int mid = left + ( right - left ) / 2;
/// intervalul actual [left,right] nu face parte integral parte din [x, y]
if ( segm_tree[node].ans == ( 1 - lazy_value ) * ( right - left + 1 ) ) /// o sa avem nevoie de fiii lui care poate nu au fost up-to-date
segm_tree[2*node+1].ans = segm_tree[2*node+1].pre = segm_tree[2*node+1].suf = ( 1 - lazy_value ) * ( mid - left + 1 ),
segm_tree[2*node+2].ans = segm_tree[2*node+2].pre = segm_tree[2*node+2].suf = ( 1 - lazy_value ) * ( right - mid );
if ( x <= mid )
update ( 2 * node + 1, left, mid, x, y, lazy_value );
if ( y >= mid + 1 )
update ( 2 * node + 2, mid + 1, right, x, y, lazy_value );
if ( segm_tree[2*node+1].ans == mid - left + 1 )
segm_tree[node].pre = segm_tree[2*node+1].ans + segm_tree[2*node+2].pre;
else
segm_tree[node].pre = segm_tree[2*node+1].pre;
if ( segm_tree[2*node+2].ans == right - mid )
segm_tree[node].suf = segm_tree[2*node+2].ans + segm_tree[2*node+1].suf;
else
segm_tree[node].suf = segm_tree[2*node+2].suf;
segm_tree[node].ans = max ( segm_tree[2*node+1].ans, segm_tree[2*node+2].ans );
segm_tree[node].ans = max ( segm_tree[node].ans, segm_tree[2*node+1].suf + segm_tree[2*node+2].pre );
}
}
int main()
{
int n, q;
fin >> n >> q;
build_tree ( 0, 1, n );
for ( int i = 1; i <= q; i ++ ) {
int tip, x, y;
fin >> tip;
if ( tip == 3 ) {
fout << segm_tree[0].ans << '\n';
}
else {
tip --;
fin >> x >> y;
update ( 0, 1, n, x, x + y - 1, tip );
}
}
return 0;
}