Cod sursa(job #1745695)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 22 august 2016 14:22:27
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 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;
    void init(int cost)
    {
        secv=st=dr=cost;
    }
    void act(aint a,aint b,int q,int w)
    {
        secv=max(a.dr+b.st,max(a.secv,b.secv));
        st=(a.st==q?q+b.st:a.st);
        dr=(b.dr==w?a.dr+w:b.dr);
    }
}arb[1<<18];
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);
    arb[nod].act(arb[left],arb[right],mid-st+1,dr-mid);
}
int main()
{
    f>>n>>m;
    arb[1]={n,n,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;
}