Cod sursa(job #2643156)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 18 august 2020 23:22:16
Problema Hotel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.92 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100000;
struct hotel
{
    int l , mij , r , lg;
    hotel(int x = 0)
    {
        l = mij = r = lg = x;
    }
};
hotel aint[4 * NMAX + 5];
int lazy[4 * NMAX + 5];
int ql , qr , new_val;
void update_nod(int nod)
{
    int ls , rs;
    ls = (nod << 1);
    rs = ((nod << 1)|1);
    if(aint[ls].l > 0)
    {
        aint[nod].l = aint[ls].l;
        if(aint[ls].l == aint[ls].lg && aint[rs].l > 0)
            aint[nod].l += aint[rs].l;
    }
    else
        aint[nod].l = 0;
    if(aint[rs].r > 0)
    {
        aint[nod].r = aint[rs].r;
        if(aint[rs].r == aint[rs].lg && aint[ls].r > 0)
            aint[nod].r += aint[ls].r;
    }
    else
        aint[nod].r = 0;
    int m1 = max(aint[ls].mij , aint[rs].mij);
    int m2 = max(aint[ls].l , aint[rs].l);
    int m3 = max(aint[ls].r , aint[rs].r);
    int m4 = aint[ls].r + aint[rs].l;
    int m5 , m6;
    m5 = m6 = 0;
    if(aint[ls].l == aint[ls].lg)
        m5 = aint[ls].lg;
    if(aint[rs].l == aint[rs].lg)
        m6 = aint[rs].lg;
    aint[nod].mij = max(m1 , max(m2 , max(m3 , max(m4 , max(m5 , max(m6 , m5 + m6))))));
    aint[nod].lg = aint[ls].lg + aint[rs].lg;
}
void lazy_update(int nod , int l)
{
    lazy[nod << 1] = lazy[nod];
    aint[nod << 1] = hotel(lazy[nod] * l);
    lazy[(nod << 1)|1] = lazy[nod];
    aint[(nod << 1)|1] = hotel(lazy[nod] * l);
    lazy[nod] = -1;
}
void build(int st , int dr , int nod)
{
    lazy[nod] = -1;
    if(st == dr)
        aint[nod] = hotel(1);
    else
    {
        int med = (st + dr) / 2;
        build(st , med , nod << 1);
        build(med + 1 , dr , (nod << 1)|1);
        update_nod(nod);
    }
}
void update(int st , int dr , int nod)
{
    if(lazy[nod] > -1 && st < dr)
        lazy_update(nod , dr - st + 1);
    if(ql <= st && dr <= qr)
    {
        lazy[nod] = new_val;
        aint[nod] = hotel(new_val * (dr - st + 1));
        return;
    }
    if(st < dr)
    {
        int med = (st + dr) / 2;
        if(ql <= med)
            update(st , med , nod << 1);
        if(qr > med)
            update(med + 1 , dr , (nod << 1)|1);
        update_nod(nod);
    }
}
int query(int n)
{
    if(lazy[1] > -1)
        lazy_update(1 , n);
    return max(aint[1].mij , max(aint[1].l , aint[1].r));
}
int main()
{
    freopen("hotel.in" , "r" , stdin);
    freopen("hotel.out" , "w" , stdout);
    int n , p , c , x , y , i;
    scanf("%d%d" , &n , &p);
    build(1 , n , 1);
    for(i = 1 ; i <= p ; i ++)
    {
        scanf("%d" , &c);
        if(c <= 2)
        {
            scanf("%d%d" , &x , &y);
            ql = x;
            qr = x + y - 1;
            if(c == 1)
                new_val = 0;
            else
                new_val = 1;
            update(1 , n , 1);
        }
        else
            printf("%d\n" , query(n));
    }
    return 0;
}