Cod sursa(job #2223249)

Utilizator AvramDanielAvram Daniel AvramDaniel Data 19 iulie 2018 15:31:31
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.96 kb
#include <bits/stdc++.h>
using namespace std;

int n,p;
struct Arbore
{
    int lungime;
    int st,dr;
    bool unit;
} arb[200010];


void build(int nod, int st, int dr)
{
    if(st==dr)
    {
        arb[nod].lungime=1;
        arb[nod].st=arb[nod].dr=1;
        arb[nod].unit=1;

        return;
    }
    int mid=(st+dr)/2;
    build(nod*2,st,mid);
    build(nod*2+1,mid+1,dr);
    arb[nod].lungime=arb[nod*2].lungime+arb[nod*2+1].lungime;
    arb[nod].st=arb[nod].dr=arb[nod].lungime;
    arb[nod].unit=1;
}

void upgrade(int nod,int st, int dr, int dela, int pinala, int value)
{
    if(st==dr)
    {
        arb[nod].lungime=value;
        arb[nod].st=arb[nod].dr=value;
        arb[nod].unit=value;
        return;
    }
    int mid=(st+dr)/2;
    if(pinala<=mid) upgrade(nod*2,st,mid,dela,pinala,value);
    else if(dela>mid) upgrade(nod*2+1,mid+1,dr,dela,pinala,value);
    else
    {
        upgrade(nod*2,st,mid,dela,pinala,value);
        upgrade(nod*2+1,mid+1,dr,dela,pinala,value);
    }
    if(arb[nod*2].st)
    {
        if(arb[nod*2].unit)
        {
            if(arb[nod*2+1].st)
            {
                if(arb[nod*2+1].unit)
                {
                    arb[nod].st=arb[nod].dr=arb[nod*2].lungime+arb[nod*2+1].lungime;
                    arb[nod].unit=1;
                }
                else
                {
                    arb[nod].st=arb[nod*2].lungime+arb[nod*2+1].st;
                    arb[nod].unit=0;
                }
            }
            else
            {
                arb[nod].st=arb[nod*2].st;
                arb[nod].unit=0;
            }
        }
        else
        {
            arb[nod].st=arb[nod*2].st;
            arb[nod].unit=0;
        }
    }
    else
    {
        arb[nod].st=0;
        arb[nod].unit=0;
    }
    if(arb[nod].unit)
    {}
    else
    {
        if(arb[nod*2+1].dr)
        {
            if(arb[nod*2+1].unit)
            {
                if(arb[nod*2].dr)
                {
                    arb[nod].dr=arb[nod*2].dr+arb[nod*2+1].dr;
                }
                else
                {
                    arb[nod].dr=arb[nod*2+1].dr;
                }
            }
            else
            {
                arb[nod].dr=arb[nod*2+1].dr;
            }
        }
        else
        {
            arb[nod].dr=arb[nod*2+1].dr;
        }
    }
    arb[nod].lungime=max(max(arb[nod].dr,arb[nod].st),arb[nod*2].dr+arb[nod*2+1].st);
}
int main()
{
    ifstream cin("hotel.in");
    ofstream cout("hotel.out");
    cin>>n>>p;
    build(1,1,n);
    for(int i=1;i<=p;i++)
    {
        int ceck,a,b;
        cin>>ceck;
        if(ceck==1)
        {
            cin>>a>>b;
            upgrade(1,1,n,a,a+b-1,0);
        }
        if(ceck==2)
        {
            cin>>a>>b;
            upgrade(1,1,n,a,a+b-1,1);
        }
        if(ceck==3) cout<<arb[1].lungime<<'\n';
    }
    return 0;
}