Cod sursa(job #2311950)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 3 ianuarie 2019 21:48:10
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.02 kb
#include <bits/stdc++.h>
#define LIM 1<<17
/// TONI BO$$ was here
/// #MLC

using namespace std;
char BUF[LIM];
int poz;

inline char getChar(){
    poz++;
    if(poz>=LIM){
    	fread(BUF,LIM,1,stdin);
    	poz=0;
    }
    return BUF[poz];
}

inline int getNr(){
    int r=0, semn=1;
    char ch=getChar();
    while(isdigit(ch)==0 && ch!='-') ch=getChar();
    if(ch=='-'){
        semn=-1;
        ch=getChar();
    }
    while(isdigit(ch)!=0){
        r=r*10+semn*(ch-'0');
        ch=getChar();
    }
    return r;
}

int n;
struct gogu
{
    int pref,suf,secv;
}arbint[500003];

void initialize(int st,int dr,int nod)
{
    arbint[nod]={dr-st+1,dr-st+1,dr-st+1};
    if(st>=dr)
        return ;
    int mij=(st+dr)/2;
    initialize(st,mij,2*nod);
    initialize(mij+1,dr,2*nod+1);
}

void _insert(int a,int b,int st,int dr,int nod)
{
    int mij=(st+dr)/2,lg1=mij-st+1,lg2=dr-mij;
    if(a<=st && b>=dr)
    {
        arbint[nod]={0,0,0};
        if(st!=dr)
        {
            arbint[2*nod]={0,0,0};
            arbint[2*nod+1]={0,0,0};
        }
        return ;
    }
    if(st!=dr && arbint[nod].secv==dr-st+1)
    {
        arbint[2*nod]={lg1,lg1,lg1};
        arbint[2*nod+1]={lg2,lg2,lg2};
    }
    if(a<=mij)
        _insert(a,b,st,mij,2*nod);
    if(b>mij)
        _insert(a,b,mij+1,dr,2*nod+1);
    arbint[nod].secv=max(arbint[2*nod].secv,arbint[2*nod+1].secv);
    arbint[nod].secv=max(arbint[nod].secv,arbint[2*nod].suf+arbint[2*nod+1].pref);
    arbint[nod].pref=arbint[2*nod].pref+arbint[2*nod+1].pref*(arbint[2*nod].pref==lg1);
    arbint[nod].suf=arbint[2*nod+1].suf+arbint[2*nod].suf*(arbint[2*nod+1].suf==lg2);
}

void _erase(int a,int b,int st,int dr,int nod)
{
    int mij=(st+dr)/2,lg1=mij-st+1,lg2=dr-mij;
    if(a<=st && b>=dr)
    {
        arbint[nod]={dr-st+1,dr-st+1,dr-st+1};
        if(st!=dr)
        {
            arbint[2*nod]={lg1,lg1,lg1};
            arbint[2*nod+1]={lg2,lg2,lg2};
        }
        return ;
    }
    if(st!=dr && arbint[nod].secv==0)
    {
        arbint[2*nod]={0,0,0};
        arbint[2*nod+1]={0,0,0};
    }
    if(a<=mij)
        _erase(a,b,st,mij,2*nod);
    if(b>mij)
        _erase(a,b,mij+1,dr,2*nod+1);
    arbint[nod].secv=max(arbint[2*nod].secv,arbint[2*nod+1].secv);
    arbint[nod].secv=max(arbint[nod].secv,arbint[2*nod].suf+arbint[2*nod+1].pref);
    arbint[nod].pref=arbint[2*nod].pref+arbint[2*nod+1].pref*(arbint[2*nod].pref==lg1);
    arbint[nod].suf=arbint[2*nod+1].suf+arbint[2*nod].suf*(arbint[2*nod+1].suf==lg2);
}

int main()
{
    int m,q,a,b;
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    n=getNr();
    m=getNr();
    initialize(1,n,1);
    while(m--)
    {
        q=getNr();
        if(q==3)
        {
            printf("%d\n",arbint[1].secv);
            continue ;
        }
        a=getNr();
        b=getNr();
        if(q==1)
            _insert(a,a+b-1,1,n,1);
        else
            _erase(a,a+b-1,1,n,1);
    }

    return 0;
}