Cod sursa(job #1208822)

Utilizator pop_bogdanBogdan Pop pop_bogdan Data 16 iulie 2014 17:10:22
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.66 kb
#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,int);

int main()
{
    is >> N >> M;
    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)
{
    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 != right )
        Update2(node,left,right);
    if ( left >= P1 && right <= P2 )
    {
        if ( type == 1 )
        {
            Arb[node].a = 0;
            Arb[node].b = 0;
            Arb[node].c = 0;
        }
        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, int left, int right)
{
    int mid = (left+right)/2;

    if ( Arb[node].c == right-left+1 )
    {
        Arb[node*2].c = mid-left+1;
        Arb[node*2].b = mid-left+1;
        Arb[node*2].a = mid-left+1;
        Arb[node*2+1].c = right-mid;
        Arb[node*2+1].b = right-mid;
        Arb[node*2+1].a = right-mid;
    }
    else
    {
        if ( Arb[node].c == 0)
        {
        Arb[node*2].c = 0;
        Arb[node*2].b = 0;
        Arb[node*2].a = 0;
        Arb[node*2+1].c = 0;
        Arb[node*2+1].b = 0;
        Arb[node*2+1].a = 0;
        }
    }
}