Cod sursa(job #3235759)

Utilizator RosuDragos123Rosu Dragos RosuDragos123 Data 21 iunie 2024 11:24:03
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("hotel.in");
ofstream cout("hotel.out");
struct node{
    int maxi,mdr,mst;
    bool semodif;
};
vector<node> a;
void update(int nod,int l,int r,int st,int dr,bool cat)
{
    if(st<=l && dr>=r)
    {
        if(!cat)
        {
            a[nod]={0,0,0,1};
        }
        else{
            a[nod]={r-l+1,r-l+1,r-l+1,1};
        }
        return;
    }


    int mij=(l+r)/2;

    if(a[nod].semodif){
        if(a[nod].maxi)
        {
            a[nod*2]={mij-l+1,mij-l+1,mij-l+1,1};
            a[nod*2+1]={r-mij,r-mij,r-mij,1};
        }
        else{
            a[nod*2]={0,0,0,1};
            a[nod*2+1]={0,0,0,1};
        }
        a[nod].semodif=false;
    }


    if(st<=mij)
        update(2*nod,l,mij,st,dr,cat);
    if(mij<dr)
        update(2*nod+1,mij+1,r,st,dr,cat);


    if(a[2*nod].mdr+a[2*nod+1].mst>max(a[nod*2].maxi,a[nod*2+1].maxi))
    {
        a[nod].maxi=a[nod*2].mdr+a[nod*2+1].mst;
    }
    else{
        a[nod].maxi=max(a[nod*2].maxi,a[nod*2+1].maxi);
    }


    if(a[2*nod].mst==mij-l+1)
    {
        a[nod].mst=mij-l+1+a[2*nod+1].mst;
    }
    else{
        a[nod].mst=a[2*nod].mst;
    }


    if(a[2*nod+1].mdr==r-mij)
    {
        a[nod].mdr=r-mij+a[2*nod].mdr;
    }
    else{
        a[nod].mdr=a[2*nod+1].mdr;
    }
}
int main()
{
    int n,q;
    cin>>n>>q;
    a.resize(4*n+4);
    a[1]={n,n,n,1};
    while(q--)
    {
        int c;
        cin>>c;
        if(c==1)
        {
            int st,dr;
            cin>>st>>dr;
            dr+=st-1;
            bool ocupat=0;
            update(1,1,n,st,dr,ocupat);
        }
        else if(c==2)
        {
            int st,dr;
            cin>>st>>dr;
            dr+=st-1;
            bool ocupat=1;
            update(1,1,n,st,dr,ocupat);
        }
        else{
            cout<<a[1].maxi<<'\n';
        }
    }
    return 0;
}