Cod sursa(job #2882583)

Utilizator Cojocaru_Andrei_CristianCojocaru Andrei Cristian Cojocaru_Andrei_Cristian Data 31 martie 2022 16:10:05
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <bits/stdc++.h>

using namespace std;

int n,aint[400005],lefti[400005],righti[400005],lazy[400005];

void update(int st,int dr,int nod,int stu,int dru,int val)
{

    if(stu<=st&&dru>=dr)
    {
        aint[nod]=(dr-st+1)*val;
        lefti[nod]=(dr-st+1)*val;
        righti[nod]=(dr-st+1)*val;
        lazy[nod]=val;
        return;
    }
    if(lazy[nod]>-1)
    {
        lazy[2*nod]=lazy[2*nod+1]=lazy[nod];
        aint[2*nod]=aint[2*nod+1]=(dr-st+1)*lazy[nod]/2;
        lefti[2*nod]=lefti[2*nod+1]=(dr-st+1)*lazy[nod]/2;
        righti[2*nod]=righti[2*nod+1]=(dr-st+1)*lazy[nod]/2;
        lazy[nod]=-1;
    }
    if(stu<=(st+dr)/2)
    {
        update(st,(st+dr)/2,2*nod,stu,dru,val);
    }
    if(dru>(st+dr)/2)
    {
        update((st+dr)/2+1,dr,2*nod+1,stu,dru,val);
    }
    if(lefti[2*nod]==(st+dr)/2-st+1)
    {
        lefti[nod] = lefti[2*nod] + lefti[2*nod+1];
    }
    else
    {
        lefti[nod] = lefti[2*nod];
    }
    if(righti[2*nod+1]==dr-(st+dr)/2)
    {
        righti[nod] = righti[2*nod+1] + righti[2*nod];
    }
    else
    {
        righti[nod] = righti[2*nod+1];
    }
    aint[nod] = max(aint[2*nod],max(aint[2*nod+1],righti[2*nod]+lefti[2*nod+1]));
}


int querry (int st, int dr, int nod, int stq, int drq)
{
    if(stq<=st&&drq>=dr)
    {
        return aint[nod];
    }
    if(lazy[nod]>-1)
    {
        lazy[2*nod]=lazy[2*nod+1]=lazy[nod];
        aint[2*nod]=aint[2*nod+1]=(dr-st+1)*lazy[nod]/2;
        lefti[2*nod]=lefti[2*nod+1]=(dr-st+1)*lazy[nod]/2;
        righti[2*nod]=righti[2*nod+1]=(dr-st+1)*lazy[nod]/2;
        lazy[nod]=-1;
    }
    int ma=-1;
    if(stq<=(st+dr)/2)
    {
        ma = max(ma,querry(st,(st+dr)/2,2*nod,stq,drq));
    }
    if(drq>(st+dr)/2)
    {
        ma = max(ma,querry((st+dr)/2+1,dr,2*nod+1,stq,drq));
    }
    int rmi=min(righti[2*nod],(st+dr/2)-stq+1);
    int lmi=min(lefti[2*nod+1],drq-(st+dr)/2);
    ma = max (ma,lmi+rmi);
    return ma;
}

int main()
{
    ifstream cin("hotel.in");
    ofstream cout("hotel.out");
    int m, cn;
    cin>>n>>m;
    cn=n;
    int p=1;
    while(p<n)
    {
        p=p*2;
    }
    n=p;
    update(1,n,1,1,cn,1);
    int t,a,b;
    for(int i=1;i<=m;i++)
    {
        cin>>t;
        if(t==1||t==2)
        {
            cin>>a>>b;
            update(1,n,1,a,a+b-1,t-1);
        }
        else
        {
            cout<<querry(1,n,1,1,cn)<<"\n";
        }
    }
    return 0;
}