Cod sursa(job #2236742)

Utilizator JakeGyllenhaalJake Gyllenhaal JakeGyllenhaal Data 30 august 2018 13:51:15
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <fstream>
#define LL long long
#define VAL 400005
#define INF 1000000000000000000

using namespace std;

ifstream fin("hotel.in");
ofstream fout("hotel.out");

struct NODES
{
    LL STOT, SBEG, SEND, SBEST;
    int lazy, LTOT, LBEG, LEND, LBEST;
};

NODES ARB[VAL];

int N, P, i, op, A, B;
LL ANS;

void Calcule(int nod)
{
    int st=2*nod, dr=2*nod+1;
    ARB[nod].STOT=ARB[st].STOT+ARB[dr].STOT;
    ARB[nod].LTOT=ARB[st].LTOT+ARB[dr].LTOT;
    ARB[nod].SBEG=max(ARB[st].SBEG, ARB[st].STOT+ARB[dr].SBEG);
    if (ARB[st].SBEG>=ARB[st].STOT+ARB[dr].SBEG)
        ARB[nod].LBEG=ARB[st].LBEG;
    else
        ARB[nod].LBEG=ARB[st].LTOT+ARB[dr].LBEG;
    ARB[nod].SEND=max(ARB[dr].SEND, ARB[st].SEND+ARB[dr].STOT);
    if (ARB[dr].SEND>=ARB[st].SEND+ARB[dr].STOT)
        ARB[nod].LEND=ARB[dr].LEND;
    else
        ARB[nod].LEND=ARB[st].LEND+ARB[dr].LTOT;
    ARB[nod].SBEST=max(ARB[st].SBEST, ARB[dr].SBEST);
    ARB[nod].SBEST=max(ARB[nod].SBEST, ARB[st].SEND+ARB[dr].SBEG);
    if (ARB[nod].SBEST==ARB[st].SEND+ARB[dr].SBEG)
        ARB[nod].LBEST=ARB[st].LEND+ARB[dr].LBEG;
    if (ARB[nod].SBEST==ARB[st].SBEST)
        ARB[nod].LBEST=ARB[st].LBEST;
    if (ARB[nod].SBEST==ARB[dr].SEND)
        ARB[nod].LBEST=ARB[dr].LBEST;
}

void Initializare(int nod, int be, int en)
{
    if (be==en)
    {
        ARB[nod].STOT=ARB[nod].SBEST=ARB[nod].SBEG=ARB[nod].SEND=1;
        ARB[nod].LTOT=ARB[nod].LBEST=ARB[nod].LBEG=ARB[nod].LEND=1;
        return;
    }
    int mid=(be+en) / 2;
    Initializare(2*nod, be, mid);
    Initializare(2*nod+1, mid+1, en);
    Calcule(nod);
}

void Propagate(int nod, int be, int en)
{
    ARB[nod].STOT+=1LL*ARB[nod].lazy*ARB[nod].LTOT;
    ARB[nod].SBEG+=1LL*ARB[nod].lazy*ARB[nod].LBEG;
    ARB[nod].SEND+=1LL*ARB[nod].lazy*ARB[nod].LEND;
    ARB[nod].SBEST+=1LL*ARB[nod].lazy*ARB[nod].LBEST;
    if (be<en)
    {
        ARB[2*nod].lazy+=ARB[nod].lazy;
        ARB[2*nod+1].lazy+=ARB[nod].lazy;
    }
    ARB[nod].lazy=0;
}

void Update(int nod, int be, int en, int A, int B, LL X)
{
    Propagate(nod, be, en);
    if (A<=be && en<=B)
    {
        ARB[nod].lazy+=X;
        return;
    }
    int mid=(be+en) / 2;
    if (max(be, A)<=min(mid, B))
        Update(2*nod, be, mid, A, B, X);
    if (max(mid+1, A)<=min(en, B))
        Update(2*nod+1, mid+1, en, A, B, X);
    Propagate(2*nod, be, mid);
    Propagate(2*nod+1, mid+1, en);
    Calcule(nod);
}

int main()
{
    fin >> N >> P;
    Initializare(1, 1, N);
    for (i=1; i<=P; i++)
    {
        fin >> op;
        if (op==3)
        {
            Propagate(1, 1, N);
            fout << max(0LL, ARB[1].SBEST) << '\n';
            continue;
        }
        fin >> A >> B;
        B+=A-1;
        if (op==1)
            Update(1, 1, N, A, B, -N-1);
        else
            Update(1, 1, N, A, B, N+1);
    }
    fin.close();
    fout.close();
    return 0;
}