Cod sursa(job #2146282)

Utilizator filip.mihalutMihalut Filip filip.mihalut Data 27 februarie 2018 21:49:02
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <iostream>
#include <fstream>
#define dim 100005

using namespace std;

ifstream f ("hotel.in");
ofstream g ("hotel.out");

int arb_max[4*dim + 50],arb_st[4*dim + 50],arb_dr[4*dim + 50]; int x,a,b,m,n,i,ultim,s,Max,caz;

inline void update(int st,int dr,int a,int b,int nod,int val)
{
    int mij = (st + dr) / 2;
    if(b < st || a > dr)
        return;

    if(a <= st && dr <= b)
    {
        arb_max[nod] = arb_st[nod] = arb_dr[nod] = val*(dr - st + 1);
        return;
    }

    if(arb_max[nod] == 0)
        arb_dr[2*nod] = arb_dr[2*nod + 1] = arb_st[2*nod] = arb_st[2*nod + 1] = arb_max[2*nod] = arb_max[2*nod + 1] = 0;

    if(arb_max[nod] == dr - st + 1)
    {
         arb_dr[2*nod] = arb_st[2*nod] = arb_max[2*nod] = mij - st + 1;
         arb_dr[2*nod + 1] = arb_st[2*nod + 1] = arb_max[2*nod + 1] = dr - mij;
    }

    update(st,mij,a,b,2*nod,val);
    update(mij + 1,dr,a,b,2*nod + 1,val);

    arb_st[nod] = arb_st[2*nod];
    if(arb_st[2*nod] == mij - st + 1)
        arb_st[nod] += arb_st[2*nod + 1];

    arb_dr[nod] = arb_dr[2*nod + 1];
    if(arb_dr[nod] == dr - mij)
        arb_dr[nod] += arb_dr[2*nod];

    arb_max[nod] = max(arb_max[2*nod] , max(arb_max[2*nod + 1] , arb_st[2*nod + 1] + arb_dr[2*nod]));
}

int main()
{
    f >> n >> m;
    update(1,n,1,n,1,1);
    for(i = 1;i <= m;i++)
    {
        f >> caz;

        switch(caz)
        {
        case 1:
            f >> a >> b;
            b = a + b - 1;
            update(1,n,a,b,1,0);
            break;
        case 2:
            f >> a >> b;
            b = a + b - 1;
            update(1,n,a,b,1,1);
            break;
        case 3:
            g << arb_max[1] << '\n';
            break;
        }
    }
    return 0;
}