Cod sursa(job #3167340)

Utilizator poparobertpoparobert poparobert Data 10 noiembrie 2023 17:23:33
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.89 kb
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
class nod
{
public :
    ll st=0,dr=0,mx=0,l=0;
};
class AINT
{
    ll n,h;
    vector<nod>v;
    vector<ll>d;
public:
    AINT(ll x=0){n=x,h=sizeof(int) * 8 - __builtin_clz(n),v.resize(2*n+3);d.resize(n+2);}
    void build()
    {
        ll i;
        for(i=0;i<n;i++)v[n+i].st=v[n+i].dr=v[n+i].mx=v[n+i].l=1,d[i]=0;
        for(i=n-1;i>0;i--)v[i].st=v[i].dr=v[i].mx=v[i].l=v[2*i].mx+v[2*i+1].mx;
    }
    void apply(ll x,ll val)
    {
        //cerr<<"apply "<<x<<endl;
        if(val==-1)
            v[x].st=v[x].dr=v[x].mx=v[x].l;
        else if(val==1)
            v[x].st=v[x].dr=v[x].mx=0;
        if(x<n)
        d[x]+=val;
    }
    nod combine(nod a,nod b)
    {
        nod rez;
        rez.st=(a.mx==a.l ? a.l+b.st:a.st);
        rez.dr=(b.mx==b.l ? b.l+a.dr : b.dr);
        rez.mx=max(max(a.mx,b.mx),a.dr+b.st);
        rez.l=a.l+b.l;
        return rez;
    }
    void push(ll p)
    {
        ll i,j;
        for(i=h;i>0;i--)
        {
            j=p>>i;
            //cerr<<"push "<<p<<' '<<j<<endl;
            apply(j<<1,d[j]);
            apply(j<<1|1,d[j]);
            d[j]=0;
        }
    }
    void upi(ll x)
    {
        while(x>1)
        {
            x>>=1;
            if(d[x]!=0)continue;
            v[x]=combine(v[2*x],v[2*x+1]);
            //cerr<<x<<' '<<v[x].mx<<' '<<v[2*x].l<<' '<<v[2*x+1].l<<endl;
        }
    }
    void set(ll p,ll l,ll val)
    {
        //cerr<<"sase "<<v[6].l<<endl;
        ll p0,l0;
        p+=n;
        push(p);
        push(p+l);
        l=p+l;
        p0=p;
        l0=l;
        //cerr<<p<<' '<<l<<endl;
        for(;p<l;p>>=1,l>>=1)
        {
            //cerr<<p<<' '<<l<<endl;
            if(p&1)apply(p++,val);
            if(l&1)apply(--l,val);
        }
        //cerr<<"sase "<<v[6].l<<endl;
        upi(p0);
        upi(l0-1);
    }
    ll ask()
    {
        nod rezl,rezr;
        ll l=n,r=2*n;
        for(;l<r;l>>=1,r>>=1)
        {
            if(l&1)rezl=combine(rezl,v[l++]);
            if(r&1)rezr=combine(v[--r],rezr);
        }
        return combine(rezl,rezr).mx;
    }
};
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    ll n,m,c,x,y;
    cin>>n>>m;
    AINT alex(n);
    alex.build();
    while(m--)
    {
        cin>>c;
        //cerr<<c<<endl;
        if(c==3)
        {
            cout<<alex.ask()<<'\n';
            continue;
        }
        cin>>x>>y;
        if(c==1)
        {
            alex.set(x-1,y,1);
        }
        if(c==2)
        {
            alex.set(x-1,y,-1);
        }
        //cerr<<'c'<<' '<<alex.ask()<<endl;
        //cerr<<"_____________________-\n";
    }
	return 0;
}