Cod sursa(job #1336742)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 8 februarie 2015 04:06:02
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream is("hotel.in");
ofstream os("hotel.out");

using VI = vector<int>;

int n, m;
int lt, rt, val;
VI t, s, d;

void Build(int nod, int st, int dr);
void Update(int nod, int st, int dr);
void Push(int nod, int st, int dr);

int main()
{
    is >> n >> m;
    s = VI(4 * n);
    d = VI(4 * n);
    t = VI(4 * n);
    Build(1, 1, n);
    int tip, v;
    while ( m-- )
    {
        is >> tip;
        if ( tip < 3 )
        {
            is >> lt >> v;
            rt = lt + v - 1;
            if ( tip == 1 )
                val = 0;
            else
                val = 1;
            Update(1, 1, n);
        }
        else
            os << t[1] << "\n";
    }
    is.close();
    os.close();
    return 0;
}

void Push(int nod, int st, int dr)
{
    if ( !t[nod] )
    {
        t[2 * nod] = s[2 * nod] = d[2 * nod] = 0;
        t[2 * nod + 1] = s[2 * nod + 1] = d[2 * nod + 1] = 0;
    }
    else
        if ( t[nod] == dr - st + 1 )
        {
            int md = ( st + dr ) / 2;
            t[2 * nod] = s[2 * nod] = d[2 * nod] = md - st + 1;
            t[2 * nod + 1] = s[2 * nod + 1] = d[2 * nod + 1] = dr - md;
        }
}

void Update(int nod, int st, int dr)
{
    if ( lt <= st && dr <= rt )
    {
        s[nod] = d[nod] = t[nod] = ( dr - st + 1 ) * val;
        return;
    }
    if ( st == dr )
        return;
    Push(nod, st, dr);
    int md = ( st + dr ) / 2;
    if ( lt <= md )
        Update(2 * nod, st, md);
    if ( md < rt )
        Update(2 * nod + 1, md + 1, dr);
    s[nod] = s[2 * nod];
    if ( s[2 * nod] == md - st + 1 )
        s[nod] += s[2 * nod + 1];
    d[nod] = d[2 * nod + 1];
    if ( d[2 * nod + 1] == dr - md )
        d[nod] += d[2 * nod];
    t[nod] = max(d[2 * nod] + s[2 * nod + 1], max(t[2 * nod], t[2 * nod + 1]));
}

void Build(int nod, int st, int dr)
{
    if ( st == dr )
    {
        t[nod] = s[nod] = d[nod] = 1;
        return;
    }
    int md = ( st + dr ) / 2;
    Build(2 * nod, st, md);
    Build(2 * nod + 1, md + 1, dr);
    t[nod] = s[nod] = d[nod] = s[2 * nod] + s[2 * nod + 1];
}