Cod sursa(job #2058899)

Utilizator danstefanDamian Dan Stefan danstefan Data 6 noiembrie 2017 13:15:24
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>
using namespace std;
int n,q,ce,in,lu,tot[400010],le[400010],ri[400010];
void build(int node,int st,int dr)
{
    tot[node]=le[node]=ri[node]=dr-st+1;
    if(st==dr)return ;
    int mid=(st+dr)/2;
    build(node*2,st,mid);
    build(node*2+1,mid+1,dr);
}
void update(int node,int l,int r,int ll,int rr,int val)
{
    if(l>rr||r<ll)return ;
    if(ll<=l&&r<=rr)
    {
        tot[node]=le[node]=ri[node]=(r-l+1)*val;
        return ;
    }
    int mid=(l+r)/2;
    if(tot[node]==0)tot[node*2]=tot[node*2+1]=le[node*2]=le[node*2+1]=ri[node*2]=ri[node*2+1]=0;
    if(tot[node]==r-l+1)
    {
        tot[node*2]=le[node*2]=ri[node*2]=mid-l+1;
        tot[node*2+1]=le[node*2+1]=ri[node*2+1]=r-mid;
    }
    update(node*2,l,mid,ll,rr,val);
    update(node*2+1,mid+1,r,ll,rr,val);
    le[node]=le[node*2];
    if(le[node*2]==mid-l+1)le[node]+=le[node*2+1];
    ri[node]=ri[node*2+1];
    if(ri[node*2+1]==r-mid)ri[node]+=ri[node*2];
    tot[node]=max(max(tot[node*2],tot[node*2+1]),ri[node*2]+le[node*2+1]);
}
int main()
{
    ifstream cin ("hotel.in");
    ofstream cout ("hotel.out");
    cin>>n>>q;
    build(1,1,n);
    while(q--)
    {
        cin>>ce;
        if(ce==1||ce==2)
        {
            cin>>in>>lu;
            update(1,1,n,in,in+lu-1,ce-1);
        }
        else cout<<tot[1]<<'\n';
    }
    return 0;
}