Cod sursa(job #2202392)

Utilizator alexandruilieAlex Ilie alexandruilie Data 8 mai 2018 18:00:24
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <fstream>
#define nmax 100005
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int i,n,p,c,a,b;
int arb[4*nmax],arbs[4*nmax],arbd[4*nmax],lazy[8*nmax];
void init(int nod,int st,int dr)
{
    if(st!=dr)
    {
        arb[nod]=arbs[nod]=arbd[nod]=dr-st+1;
        int mid=(st+dr)/2;
        init(2*nod,st,mid);
        init(2*nod+1,mid+1,dr);
    }
    else
    {
        arb[nod]=arbs[nod]=arbd[nod]=dr-st+1;
    }
}
void propag(int nod)
{
    if(lazy[nod]==-1) return;
    if(lazy[nod]==0)
    {lazy[nod]=-1;
    lazy[2*nod]=lazy[2*nod+1]=0;
    arbs[2*nod]=arbd[2*nod]=arb[2*nod]=arbs[2*nod+1]=arbd[2*nod+1]=arb[2*nod+1]=0;
    }
    else
    {
    lazy[2*nod]=lazy[2*nod+1]=lazy[nod]/2;
    lazy[2*nod]+=lazy[nod]%2;
    arbs[2*nod]=arbd[2*nod]=arb[2*nod]=lazy[nod]/2+lazy[nod]%2;
    arbs[2*nod+1]=arbd[2*nod+1]=arb[2*nod+1]=lazy[nod]/2;
     lazy[nod]=-1;
    }
}
void upd1(int nod,int st,int dr,int a,int b)
{
    if(a<=st&&dr<=b)
    {
        lazy[nod]=0;
        arb[nod]=arbs[nod]=arbd[nod]=0;
    }
    else
    {
        propag(nod);
        int mid=(st+dr)/2;
        if(a<=mid) upd1(2*nod,st,mid,a,b);
        if(b>mid) upd1(2*nod+1,mid+1,dr,a,b);
        arb[nod]=max(max(arb[2*nod],arb[2*nod+1]),arbd[2*nod]+arbs[2*nod+1]);
        arbs[nod]=arbs[2*nod];
        arbd[nod]=arbd[2*nod+1];
        if(arbs[2*nod]==mid-st+1) arbs[nod]+=arbs[2*nod+1];
        if(arbd[2*nod+1]==dr-mid) arbd[nod]+=arbd[2*nod];
    }
}
void upd2(int nod,int st,int dr,int a,int b)
{
    if(a<=st&&dr<=b)
    {
        lazy[nod]=b-a+1;
        arb[nod]=arbs[nod]=arbd[nod]=dr-st+1;
    }
    else
    {
        propag(nod);
        int mid=(st+dr)/2;
        if(a<=mid) upd2(2*nod,st,mid,a,b);
        if(b>mid) upd2(2*nod+1,mid+1,dr,a,b);
        arb[nod]=max(max(arb[2*nod],arb[2*nod+1]),arbd[2*nod]+arbs[2*nod+1]);
        arbs[nod]=arbs[2*nod];
        arbd[nod]=arbd[2*nod+1];
        if(arbs[2*nod]==mid-st+1) arbs[nod]+=arbs[2*nod+1];
        if(arbd[2*nod+1]==dr-mid) arbd[nod]+=arbd[2*nod];
    }
}
int main()
{
    f>>n>>p;
    init(1,1,n);
    for(i=1;i<=4*nmax;i++) lazy[i]=-1;
    for(i=1;i<=p;i++)
    {
        f>>c;
        if(c==1) {f>>a>>b;upd1(1,1,n,a,a+b-1);}
        if(c==2) {f>>a>>b;upd2(1,1,n,a,a+b-1);}
        if(c==3) {propag(1);g<<arb[1]<<'\n';}
    }
    return 0;
}