Cod sursa(job #901708)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 1 martie 2013 11:22:31
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.96 kb
#include <fstream>
#define MAX 4*100000 + 66
using namespace std;

int n, q, x, y, t, L[MAX], R[MAX], arb[MAX], lazy[MAX];

void build(int nod, int l, int r)
{
    L[nod] = R[nod] = arb[nod] = r - l + 1;
    if(l == r) return;
    int m = (l+r)/2;
    build(2*nod, l, m);
    build(2*nod+1, m+1, r);
}

void checkout(int nod, int l, int r, int p)
{
    if(lazy[nod] and !p)
    {
        p = lazy[nod];
        lazy[nod] = 0;
    } else lazy[nod] = 0;
    if(p == 1)
    {
        L[nod] = R[nod] = arb[nod] = 0;
        L[2*nod] = R[2*nod] = arb[2*nod] = 0;
        L[2*nod+1] = R[2*nod+1] = arb[2*nod+1] = 0;
        lazy[2*nod] = lazy[2*nod+1] = p;
    }
    else if(p == 2)
    {
        L[nod] = R[nod] = arb[nod] = r - l + 1;
        L[2*nod] = R[2*nod] = arb[2*nod] = r - l + 1;
        L[2*nod+1] = R[2*nod+1] = arb[2*nod+1] = r - l + 1;
        lazy[2*nod] = lazy[2*nod+1] = p;
    }
    if(x <= l and y >= r)
    {
        L[nod] = R[nod] = arb[nod] = r - l + 1;
        lazy[nod] = 2;
        return;
    }
    int m = (l+r)/2;
    if(x <= m) checkout(2*nod, l, m, p); //se poate schimba L
    if(y > m) checkout(2*nod+1, m+1, r, p); //se poate schimba R
    L[nod] = L[2*nod]; R[nod] = R[2*nod+1];
    if(L[nod] == m - l + 1) L[nod] = L[2*nod] + L[2*nod+1];
    if(R[nod] == r - m) R[nod] = R[2*nod] + R[2*nod+1];
    arb[nod] = max(arb[2*nod], arb[2*nod+1]);
    arb[nod] = max(arb[nod], L[2*nod+1]+R[2*nod]);
}

void checkin(int nod, int l, int r, int p)
{
    if(lazy[nod] and !p)
    {
        p = lazy[nod];
        lazy[nod] = 0;
    } else lazy[nod] = 0;
    if(p == 1)
    {
        L[nod] = R[nod] = arb[nod] = 0;
        L[2*nod] = R[2*nod] = arb[2*nod] = 0;
        L[2*nod+1] = R[2*nod+1] = arb[2*nod+1] = 0;
        lazy[2*nod] = lazy[2*nod+1] = p;
    }
    else if(p == 2)
    {
        L[nod] = R[nod] = arb[nod] = r - l + 1;
        L[2*nod] = R[2*nod] = arb[2*nod] = r - l + 1;
        L[2*nod+1] = R[2*nod+1] = arb[2*nod+1] = r - l + 1;
        lazy[2*nod] = lazy[2*nod+1] = p;
    }
    if(x <= l and y >= r)
    {
        L[nod] = R[nod] = arb[nod] = 0;
        lazy[nod] = 1;
        return;
    }
    int m = (l+r)/2;
    if(x <= m) checkin(2*nod, l, m, p); //se poate schimba L
    if(y > m) checkin(2*nod+1, m+1, r, p); //se poate schimba R
    L[nod] = L[2*nod]; R[nod] = R[2*nod+1];
    if(L[nod] == m - l + 1) L[nod] = L[2*nod] + L[2*nod+1];
    if(R[nod] == r - m) R[nod] = R[2*nod] + R[2*nod+1];
    arb[nod] = max(arb[2*nod], arb[2*nod+1]);
    arb[nod] = max(arb[nod], L[2*nod+1]+R[2*nod]);
}

int main()
{
    ifstream fi("hotel.in");
    ofstream fo("hotel.out");
    fi >> n >> q;
    build(1, 1, n);
    while(q--)
    {
        fi >> t;
        if(t != 3)
        {
            fi >> x >> y;
            y += x - 1;
            if(t == 1) checkin(1, 1, n, 0);
            if(t == 2) checkout(1, 1, n, 0);
        }
        else fo << arb[1] << "\n";
    }
    return 0;
}