Cod sursa(job #2068422)

Utilizator geralt_of_riviajohn nathalis geralt_of_rivia Data 17 noiembrie 2017 20:18:29
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>

using namespace std;
ifstream cin ("hotel.in");
ofstream cout ("hotel.out");
int n,m,beg[300100],endd[300100],l[300100],lt,rt,p;
void up_date (int st,int dr,int nod)
{
    if(lt<=st && dr<=rt)
        beg[nod]=endd[nod]=l[nod]=(dr-st+1)*(p-1);
    else
    {
        int mij=(st+dr)/2;
        if(dr-st+1==l[nod]) beg[nod*2]=endd[nod*2]=l[nod*2]=mij-st+1,beg[nod*2+1]=endd[nod*2+1]=l[nod*2+1]=dr-mij;
        if(l[nod]==0) beg[nod*2]=endd[nod*2]=l[nod*2]=0,beg[nod*2+1]=endd[nod*2+1]=l[nod*2+1]=0;
        if(lt<=mij) up_date(st,mij,nod*2);
        if(rt>mij) up_date(mij+1,dr,nod*2+1);
        beg[nod]=beg[nod*2]; if(beg[nod*2]==mij-st+1) beg[nod]+=beg[nod*2+1];
        endd[nod]=endd[nod*2+1]; if(endd[nod*2+1]==dr-mij) endd[nod]+=endd[nod*2];
        l[nod]=max(beg[nod],endd[nod]);
        l[nod]=max(l[nod],l[nod*2]);
        l[nod]=max(l[nod],l[nod*2+1]);
        l[nod]=max(l[nod],endd[nod*2]+beg[nod*2+1]);
    }
}
void read ()
{   cin>>n>>m;
    p=2; lt=1; rt=n; up_date(1,n,1);
    for(int i=1;i<=m;i++)
    {
        cin>>p;
        if(p==3) cout<<l[1]<<"\n"; else
        {
            cin>>lt>>rt;
            rt=lt+rt-1;
            up_date(1,n,1);
        }
    }
}
int main()
{
    read();
    cin.close();
    cout.close();
    return 0;
}