Cod sursa(job #3157766)

Utilizator RobertAcAcatrinei Robert-Marian RobertAc Data 16 octombrie 2023 20:11:17
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 5.08 kb
#include <bits/stdc++.h>
#ifdef LOCAL
#define in cin
#define out cout
#endif

using namespace std;

#ifndef LOCAL
ifstream in("hotel.in");
ofstream out("hotel.out");
#endif

struct aint
{
    int nxtp2(int n)
    {
        int p=1;
        while(p<n)p*=2;
        return p;
    }
    int offset;
    int *data,*lazy;
    int *pref,*suf,*maxx;
    aint(int n)
    {
        offset=nxtp2(n);
        data = new int[offset*2];
        lazy = new int[offset*2];
        pref = new int[offset*2];
        suf = new int[offset*2];
        maxx = new int[offset*2];
        for(int i=0;i<n;i++)data[i+offset]=1;
        for(int i=0;i<offset*2;i++)
        {
            lazy[i]=pref[i]=suf[i]=maxx[i]=0;
        }
        init(0,offset-1,1);
        //cerr<<"here\n";
    }
    void debug(int ind)
    {
        ind++;
        cerr<<ind<<".\n";
        cerr<<"data\n";
        for(int i=0,ind=1;i<1;i++,ind++)cerr<<data[ind]<<' ';
        cerr<<'\n';
        for(int i=0,ind=2;i<2;i++,ind++)cerr<<data[ind]<<' ';
        cerr<<'\n';
        for(int i=0,ind=4;i<4;i++,ind++)cerr<<data[ind]<<' ';
        cerr<<'\n';
        for(int i=0,ind=8;i<8;i++,ind++)cerr<<data[ind]<<' ';
        cerr<<'\n';
        for(int i=0,ind=16;i<16;i++,ind++)cerr<<data[ind]<<' ';
        cerr<<'\n';
        cerr<<"pref\n";
        for(int i=0,ind=1;i<1;i++,ind++)cerr<<pref[ind]<<' ';
        cerr<<'\n';
        for(int i=0,ind=2;i<2;i++,ind++)cerr<<pref[ind]<<' ';
        cerr<<'\n';
        for(int i=0,ind=4;i<4;i++,ind++)cerr<<pref[ind]<<' ';
        cerr<<'\n';
        for(int i=0,ind=8;i<8;i++,ind++)cerr<<pref[ind]<<' ';
        cerr<<'\n';
        for(int i=0,ind=16;i<16;i++,ind++)cerr<<pref[ind]<<' ';
        cerr<<'\n';
        cerr<<"suf\n";
        for(int i=0,ind=1;i<1;i++,ind++)cerr<<suf[ind]<<' ';
        cerr<<'\n';
        for(int i=0,ind=2;i<2;i++,ind++)cerr<<suf[ind]<<' ';
        cerr<<'\n';
        for(int i=0,ind=4;i<4;i++,ind++)cerr<<suf[ind]<<' ';
        cerr<<'\n';
        for(int i=0,ind=8;i<8;i++,ind++)cerr<<suf[ind]<<' ';
        cerr<<'\n';
        for(int i=0,ind=16;i<16;i++,ind++)cerr<<suf[ind]<<' ';
        cerr<<'\n';
        cerr<<"maxx\n";
        for(int i=0,ind=1;i<1;i++,ind++)cerr<<maxx[ind]<<' ';
        cerr<<'\n';
        for(int i=0,ind=2;i<2;i++,ind++)cerr<<maxx[ind]<<' ';
        cerr<<'\n';
        for(int i=0,ind=4;i<4;i++,ind++)cerr<<maxx[ind]<<' ';
        cerr<<'\n';
        for(int i=0,ind=8;i<8;i++,ind++)cerr<<maxx[ind]<<' ';
        cerr<<'\n';
        for(int i=0,ind=16;i<16;i++,ind++)cerr<<maxx[ind]<<' ';
        cerr<<"\n\n";
    }
    void init(int st,int dr,int node)
    {
        if(st==dr)
        {
            suf[node]=pref[node]=maxx[node]=data[node];
        }
        else
        {
        int mid=(st+dr)/2;
        int s=dr-st+1;
        init(st,mid,node*2);
        init(mid+1,dr,node*2+1);
        data[node]=data[node*2]+data[node*2+1];
        maxx[node]=max(maxx[node*2],maxx[node*2+1]);
        maxx[node]=max(maxx[node],pref[node*2]);
        maxx[node]=max(maxx[node],suf[node*2]+pref[node*2+1]);
        maxx[node]=max(maxx[node],suf[node*2+1]);
        if(data[node*2]==s/2)pref[node]=s/2+pref[node*2+1];
        else pref[node]=pref[node*2];
        if(data[node*2+1]==s/2)suf[node]=s/2+suf[node*2];
        else suf[node]=suf[node*2+1];
        }
    }
    void pushLazy(int st,int dr,int node)
    {
        if(st!=dr)
        {
            lazy[node*2]+=lazy[node];
            lazy[node*2+1]+=lazy[node];
        }
        int s=dr-st+1;
        data[node]+=s*lazy[node];
        if(lazy[node]!=0)suf[node]=pref[node]=maxx[node]=data[node];
        lazy[node]=0;
    }
    void _update(int l,int r,int val,int st,int dr,int node)
    {
        pushLazy(st,dr,node);
        if(l>r)return;
        if(l==st&&r==dr)
        {
            lazy[node]+=val;
            pushLazy(st,dr,node);
        }
        else
        {
            pushLazy(st,dr,node);
            int mid=(st+dr)/2;
            int s=dr-st+1;
            _update(l,min(r,mid),val,st,mid,node*2);
            _update(max(mid+1,l),r,val,mid+1,dr,node*2+1);
            data[node]=data[node*2]+data[node*2+1];
            maxx[node]=max(maxx[node*2],maxx[node*2+1]);
            maxx[node]=max(maxx[node],pref[node*2]);
            maxx[node]=max(maxx[node],suf[node*2]+pref[node*2+1]);
            maxx[node]=max(maxx[node],suf[node*2+1]);
            if(data[node*2]==s/2)pref[node]=s/2+pref[node*2+1];
            else pref[node]=pref[node*2];
            if(data[node*2+1]==s/2)suf[node]=s/2+suf[node*2];
            else suf[node]=suf[node*2+1];
        }
    }
    void update(int l,int r,int val)
    {
        _update(l,r,val,0,offset-1,1);
    }
};

int main()
{
    int n,p;in>>n>>p;
    aint root = aint(n);
    for(int i=0;i<p;i++)
    {
        //root.debug(i);
        int c;in>>c;
        if(c==1)
        {
            int a,b;in>>a>>b;
            a--;
            b=a+b-1;
            root.update(a,b,-1);
        }
        else if(c==2)
        {
            int a,b;in>>a>>b;
            a--;  
            b=a+b-1;
            root.update(a,b,1);  
        }
        else
        {
            out<<root.maxx[1]<<'\n';
        }
    }
}