Cod sursa(job #2309500)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 29 decembrie 2018 10:42:00
Problema Hotel Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");
int l[200002],r[200002],a[200002],l1,r1;
void scoate(int l2,int r2,int nr)
{
    if((l1<=l2&&r2<=r1)||l2==r2)
    {
        l[nr]=r[nr]=a[nr]=0;
        if(l2!=r2)
        {
            int m=(l2+r2)/2;
            scoate(l2,m,nr*2);
            scoate(m+1,r2,nr*2+1);
        }
        return;
    }
    int m=(l2+r2)/2;
    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;
        if(l2!=r2)
        {
            int m=(l2+r2)/2;
            baga(l2,m,nr*2);
            baga(m+1,r2,nr*2+1);
        }
        return;
    }
    int m=(l2+r2)/2;
    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;
    l1=1;r1=n;baga(1,n,1);
    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;	
}