Cod sursa(job #2394917)

Utilizator albucristianAlbu Cristian-Gabriel albucristian Data 2 aprilie 2019 09:09:46
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>
using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");
int l,r,st,dr,n,p,val,op;
struct nume
{
    int gol,s,d,down;
}v[300003];
void update(int nod,int l,int r)
{
    if(l>=st&&r<=dr)
    {
        if(val==1)
            v[nod].s=v[nod].d=v[nod].gol=0;
        else
            v[nod].s=v[nod].d=v[nod].gol=r-l+1;
        v[nod].down=1;
        return;
    }
    int mij=(l+r)/2;
    if(v[nod].down==1)
    {
        if(v[nod].gol==0)
        {
            v[2*nod].gol=v[2*nod].s=v[2*nod].d=0;
            v[2*nod+1].gol=v[2*nod+1].s=v[2*nod+1].d=0;
        }
        else
        {
            v[2*nod].gol=v[2*nod].s=v[2*nod].d=mij-l+1;
            v[2*nod+1].gol=v[2*nod+1].s=v[2*nod+1].d=r-mij;
        }
        v[2*nod].down=v[2*nod+1].down=1;
        v[nod].down=0;
    }
    if(st<=mij)
        update(2*nod,l,mij);
    if(mij<dr)
        update(2*nod+1,mij+1,r);
    v[nod].gol=max(max(v[2*nod].gol,v[2*nod+1].gol),v[2*nod].d+v[2*nod+1].s);
    v[nod].s=v[2*nod].s;
    if(v[2*nod].s==mij-l+1)
        v[nod].s+=v[2*nod+1].s;
    v[nod].d=v[2*nod+1].d;
    if(v[2*nod+1].d==r-mij)
        v[nod].d+=v[2*nod].d;
}
void solve()
{
    in>>n>>p;
    st=1;
    dr=n;
    val=2;
    update(1,1,n);
    for(int i=1;i<=p;i++)
    {
        in>>op;
        if(op==1)
        {
            in>>st>>dr;
            dr=st+dr-1;
            val=1;
            update(1,1,n);
        }
        else
        {
            if(op==2)
            {
                in>>st>>dr;
                dr=st+dr-1;
                val=0;
                update(1,1,n);
            }
            else
            {
                out<<v[1].gol<<"\n";
            }
        }
    }
}
int main()
{
    solve();
    return 0;
}