Cod sursa(job #2955891)

Utilizator MarutBrabete Marius Stelian Marut Data 18 decembrie 2022 03:21:40
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<bits/stdc++.h>
using namespace std;
struct aj
{
    int x,st,dr;
};
aj aint[400005];
int lazy[400005];
inline void update(int node, int st, int dr, int stt, int drr, int _)
{
    if(lazy[node]==-1)
    {
        lazy[node]=0;
        lazy[2*node]=-1;
        lazy[2*node+1]=-1;
    }
        else if(lazy[node]==1)
        {
            lazy[2*node]=1;
            lazy[2*node+1]=1;
        }
    if(_==-1) lazy[node]=0;
    if(stt<=st&&dr<=drr)
    {
        lazy[node]=_;
        return;
    }
    int med=(st+dr)>>1;
    if(stt<=med) update(2*node,st,med,stt,drr,_);
    if(med<drr) update(2*node+1,med+1,dr,stt,drr,_);
}
void query(int node, int st, int dr)
{
    if(lazy[node]==1)
    {
        aint[node].x=aint[node].st=aint[node].dr=dr-st+1;
        return;
    }
        else if(lazy[node]==-1)
        {
            aint[node].x=aint[node].st=aint[node].dr=0;
            return;
        }
    if(st==dr) return;
    int med=(st+dr)>>1;
    query(2*node,st,med);
    query(2*node+1,med+1,dr);
    aint[node].st=aint[2*node].st;
    aint[node].dr=aint[2*node+1].dr;
    aint[node].st+= (aint[2*node].st == med-st+1) ? aint[2*node+1].st : 0;
    aint[node].dr+= (aint[2*node+1].dr == dr-med) ? aint[2*node].dr : 0;
    aint[node].x = max(max(aint[2*node].x,aint[2*node+1].x),aint[2*node].dr+aint[2*node+1].st);
}
int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    int x,y,type,n,q;
    scanf("%d%d",&n,&q);
    for(register int i=1;i<=4*n;i++)
        lazy[i]=1;
    for(register int i=1;i<=q;i++)
    {
        scanf("%d",&type);
        if(!(type-1))
        {
            scanf("%d%d",&x,&y);
            update(1,1,n,x,x+y-1,-1);
        }
        else if(!(type-2))
        {
            scanf("%d%d",&x,&y);
            update(1,1,n,x,x+y-1,1);
        }
        else
        {
            query(1,1,n);
            printf("%d\n",aint[1].x);
        }
    }
    return 0;
}