Cod sursa(job #2884377)

Utilizator Cojocaru_Andrei_CristianCojocaru Andrei Cristian Cojocaru_Andrei_Cristian Data 3 aprilie 2022 02:54:47
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <bits/stdc++.h>

using namespace std;

int v[200005],aint[400005],n,lazy[400005],left1[400005],right1[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;
        left1[nod]=(dr-st+1)*val;
        right1[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;
        left1[2*nod]=left1[2*nod+1]=(dr-st+1)*lazy[nod]/2;
        right1[2*nod]=right1[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(left1[2*nod]==(st+dr)/2-st+1)
    {
        left1[nod] = left1[2*nod] + left1[2*nod+1];
    }
    else
    {
        left1[nod] = left1[2*nod];
    }
    if(right1[2*nod+1]==dr-(st+dr)/2)
    {
        right1[nod] = right1[2*nod+1] + right1[2*nod];
    }
    else
    {
        right1[nod] = right1[2*nod+1];
    }
    aint[nod] = max(aint[2*nod],max(aint[2*nod+1],right1[2*nod]+left1[2*nod+1]));
}


int querry1(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;
        left1[2*nod]=left1[2*nod+1]=(dr-st+1)*lazy[nod]/2;
        right1[2*nod]=right1[2*nod+1]=(dr-st+1)*lazy[nod]/2;
        lazy[nod]=-1;
    }
    int ma=-1;
    if(stq<=(st+dr)/2)
    {
        ma = max(ma,querry1(st,(st+dr)/2,2*nod,stq,drq));
    }
    if(drq>(st+dr)/2)
    {
        ma = max(ma,querry1((st+dr)/2+1,dr,2*nod+1,stq,drq));
    }

    int rm1=min(right1[2*nod],(st+dr/2)-stq+1);
    int lm1=min(left1[2*nod+1],drq-(st+dr)/2);
    ma = max (ma,lm1+rm1);
    return ma;
}

int main()
{
    ifstream cin("hotel.in");
    ofstream cout("hotel.out");
    int m;
    cin>>n>>m;
    int put=1;
    int cpn=n;
    while(put<n)
    {
        put=put*2;
    }
    n=put;
    update(1,n,1,1,cpn,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<<querry1(1,n,1,1,cpn)<<"\n";
        }
    }
    return 0;
}