Cod sursa(job #1738144)

Utilizator KonoplyankaKonoplyanka Konoplyanka Data 5 august 2016 19:41:58
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int n,m,tip,i,cur,a,b;
struct aint
{
    int secv,st,dr;
    inline void init(int cost)
    {
        secv=st=dr=cost;
    }

}arb[1<<18];
inline void act(int C,int A,int B,int q,int w)
{
    arb[C].secv=max(arb[A].dr+arb[B].st,max(arb[A].secv,arb[B].secv));
    arb[C].st=(arb[A].st==q?q+arb[B].st:arb[A].st);
    arb[C].dr=(arb[B].dr==w?arb[A].dr+w:arb[B].dr);
}
inline void update(int nod,int st,int dr)
{
    if(a<=st&&dr<=b)
    {
        arb[nod].init((dr-st+1)*cur);
        return ;
    }
    int mid=(st+dr)>>1;
    int left=nod<<1;
    int right=(nod<<1)+1;
    if(arb[nod].secv==dr-st+1)
    {
        arb[left].init(mid-st+1);
        arb[right].init(dr-mid);
    }
    else if(!arb[nod].secv)
    {
        arb[left].init(0);
        arb[right].init(0);
    }
    if(a<=mid) update(left,st,mid);
    if(mid<b) update(right,mid+1,dr);
    act(nod,left,right,mid-st+1,dr-mid);
}
int main()
{
    f>>n>>m;
    arb[1].init(n);
    for(i=1;i<=m;++i)
    {
        f>>tip;
        if(tip==3) g<<arb[1].secv<<'\n';
        else
        {
            f>>a>>b;
            b+=a-1;
            cur=(tip==2);
            update(1,1,n);
        }
    }
    return 0;
}