Cod sursa(job #2774028)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 9 septembrie 2021 15:09:18
Problema Hotel Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <cstdio>

using namespace std;

const int NMAX=(1 << 18);

int n,p,c,a,b;
int arb[4*NMAX],arbst[4*NMAX],arbdr[4*NMAX];

int maxim(int x, int y)
{
    if(x>y)
        return x;
    else
        return y;
}

void init(int st, int dr, int poz)
{
    if(st==dr)
    {
        arb[poz]=arbst[poz]=arbdr[poz]=1;
    }
    else
    {
        int mij=(st+dr)/2;
        init(st,mij,2*poz);
        init(mij+1,dr,2*poz+1);
        arb[poz]=arbst[poz]=arbdr[poz]=dr-st+1;
    }
}

void update(int st, int dr, int poz, int tip)
{
    if(st==dr)
    {
        if(tip==1)
            arb[poz]=arbst[poz]=arbdr[poz]=0;
        else
            arb[poz]=arbst[poz]=arbdr[poz]=1;
    }
    else
    {
        int mij=(st+dr)/2;
        if(a<=mij)
            update(st,mij,2*poz,tip);
        if(b>=mij+1)
            update(mij+1,dr,2*poz+1,tip);
        if(arbst[2*poz]==mij-st+1)
            arbst[poz]=arbst[2*poz]+arbst[2*poz+1];
        else
            arbst[poz]=arbst[2*poz];
        if(arbdr[2*poz+1]==dr-mij)
            arbdr[poz]=arbdr[2*poz+1]+arbdr[2*poz];
        else
            arbdr[poz]=arbdr[2*poz+1];
        arb[poz]=maxim(arbdr[2*poz]+arbst[2*poz+1],maxim(arb[2*poz],arb[2*poz+1]));
    }
}

int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    scanf("%d%d",&n,&p);
    init(1,n,1);
    for(;p>=1;p--)
    {
        scanf("%d",&c);
        if(c==3)
            printf("%d\n",arb[1]);
        else
        {
            scanf("%d%d",&a,&b);
            b=a+b-1;
            update(1,n,1,c);
        }
    }
    return 0;
}