Cod sursa(job #1829581)

Utilizator vladbatalanBatalan Vlad vladbatalan Data 15 decembrie 2016 12:15:26
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
#include <iostream>
#define dim 100010

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

int L[4*dim],R[4*dim],TIP[4*dim], BEST[4*dim];
int n,m, op,A,B,val,st,dr,N;

void Update(int nod, int left, int right)
{
    int FD = (nod<<1)+1, FS = nod<<1;
    if(left>dr || right <st)
        return;
    if(left == right && st<=left && right <= dr)
    {
        TIP[nod] = BEST[nod] = L[nod] = R[nod] = val;
        return;
    }
    int mid = (left+right)/2;
    Update(FS, left, mid);
    Update(FD, mid+1, right);
    if(TIP[FS] == TIP[FD])
    {
        if(TIP[FS]!=2)
        {
            TIP[nod] = TIP[FS];
            BEST[nod] = BEST[FS] + BEST[FD];
            L[nod] = R[nod] = BEST[nod];
            return;
        }
        TIP[nod]=2;
        L[nod]=L[FS];
        R[nod]=R[FD];
        BEST[nod]=max(BEST[FS], BEST[FD]);
        BEST[nod]=max(BEST[nod], R[FS]+L[FD]);
        return;
    }
    L[nod]=L[FS]; R[nod]=R[FD]; TIP[nod]=2;
    if(TIP[FS]==1)
        L[nod] = L[FS] + L[FD];
    if(TIP[FD]==1)
        R[nod] = R[FD] + R[FS];
    BEST[nod] = max(BEST[FS], BEST[FD]);
    BEST[nod]=max(BEST[nod], R[FS]+L[FD]);
}

int main()
{
    fin>>n>>m;
    for(N=1;N<n;N<<=1);
    st=1; dr=n; val=1;
    Update(1,1,N);
    while(m--)
    {
        fin>>op;
        if(op==3)
            fout<<BEST[1]<<'\n';
        else
        {
            fin>>A>>B;
            if(op==1)
            {
                val=0;st=A;dr=A+B-1;
                Update(1,1,N);
            }
            else
            {
                val=1;st=A;dr=A+B-1;
                Update(1,1,N);
            }
        }
    }

    return 0;
}