Cod sursa(job #2310834)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 2 ianuarie 2019 10:04:50
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");
int l[1000002],r[1000002],a[1000002],l1,r1;
void scoate(int l2,int r2,int nr)
{
    if((l1<=l2&&r2<=r1)||l2==r2)
    {
        l[nr]=r[nr]=a[nr]=0;
        return;
    }
    int m=(l2+r2)/2;
    if(!a[nr])
        l[nr*2]=r[nr*2]=a[nr*2]=l[nr*2+1]=r[nr*2+1]=a[nr*2+1]=0;
    if(a[nr]==r2-l2+1)
        l[nr*2]=r[nr*2]=a[nr*2]=m-l2+1,l[nr*2+1]=r[nr*2+1]=a[nr*2+1]=r2-m;
    if(l1<=m)
        scoate(l2,m,nr*2);
    if(r1>m)
        scoate(m+1,r2,nr*2+1);
    if(l1<=l2)
        l[nr]=0;
    else
        l[nr]=min(l1-l2,l[nr]);
    if(r1>=r2)
        r[nr]=0;
    else
        r[nr]=min(r2-r1,r[nr]);
    a[nr]=max(max(a[nr*2],a[nr*2+1]),r[nr*2]+l[nr*2+1]);
}
void baga(int l2,int r2,int nr)
{
    if((l1<=l2&&r2<=r1)||l2==r2)
    {
        l[nr]=r[nr]=a[nr]=r2-l2+1;
        return;
    }
    int m=(l2+r2)/2;
    if(!a[nr])
        l[nr*2]=r[nr*2]=a[nr*2]=l[nr*2+1]=r[nr*2+1]=a[nr*2+1]=0;
    if(a[nr]==r2-l2+1)
        l[nr*2]=r[nr*2]=a[nr*2]=m-l2+1,l[nr*2+1]=r[nr*2+1]=a[nr*2+1]=r2-m;
    if(l1<=m)
        baga(l2,m,nr*2);
    if(r1>m)
        baga(m+1,r2,nr*2+1);
    if(l[nr*2]==m-l2+1)
        l[nr]=l[nr*2]+l[nr*2+1];
    else
        l[nr]=l[nr*2];
    if(r[nr*2+1]==r2-m)
        r[nr]=r[nr*2]+r[nr*2+1];
    else
        r[nr]=r[nr*2+1];
    a[nr]=max(max(a[nr*2],a[nr*2+1]),r[nr*2]+l[nr*2+1]);
}
int main()	
{
    int n,q,nr;
    in>>n>>q;
    a[1]=l[1]=r[1]=n;
    while(q--)
    {
        in>>nr;
        if(nr==3)
            out<<a[1]<<"\n";
        else if(nr==2)
        {
            in>>l1>>r1;
            r1+=l1-1;
            baga(1,n,1);
        }
        else
        {
            in>>l1>>r1;
            r1+=l1-1;
            scoate(1,n,1);
        }
    }
    return 0;	
}