Cod sursa(job #3235760)

Utilizator Darius1414Dobre Darius Adrian Darius1414 Data 21 iunie 2024 11:39:24
Problema Hotel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <iostream>
#include <fstream>
#define nmx 100005
using namespace std;
int n,c,pz,nr,p,arb[4*nmx],starb[4*nmx],drarb[4*nmx],lzset[4*nmx];
void build(int st,int dr,int index)
{
    if (st==dr)
    {
        arb[index]=starb[index]=drarb[index]=1;
        return;
    }
    int mid=(st+dr)/2;
    build(st,mid,index*2);
    build(mid+1,dr,index*2+1);
    arb[index]=starb[index]=drarb[index]=dr-st+1;
}
void lazy(int st,int dr,int index)
{
    if (lzset[index]==1)
    {
        arb[index]=starb[index]=drarb[index]=0;
        if (st!=dr)
            lzset[index*2]=lzset[index*2+1]=1;
        lzset[index]=0;
    }
    else if (lzset[index]==2)
    {
        arb[index]=starb[index]=drarb[index]=dr-st+1;
        if (st!=dr)
            lzset[index*2]=lzset[index*2+1]=2;
        lzset[index]=0;
    }
}
void update(int st,int dr,int a,int b,int index,int val)
{
    if (st>b || dr<a)
        return;
    lazy(st,dr,index);
    if (a<=st && dr<=b)
    {
        lzset[index]=val;
        lazy(st,dr,index);
        return;
    }
    int mid=(st+dr)/2;
    update(st,mid,a,b,index*2,val);
    update(mid+1,dr,a,b,index*2+1,val);
    arb[index]=max(arb[index*2],max(arb[index*2+1],drarb[index*2]+starb[index*2+1]));
    if (mid-st+1==starb[index*2])
        starb[index]=starb[index*2]+starb[index*2+1];
    else starb[index]=starb[index*2];
    if (dr-mid==drarb[index*2+1])
        drarb[index]=drarb[index*2]+drarb[index*2+1];
    else drarb[index]=drarb[index*2+1];
}
int main()
{
    ifstream f ("hotel.in");
    ofstream g ("hotel.out");
    f>>n>>p;
    build(1,n,1);
    update(1,n,1,n,1,2);
    for (int i=1; i<=p; i++)
    {
        f>>c;
        if (c==1)
        {
            f>>pz>>nr;
            update(1,n,pz,pz+nr-1,1,1);
        }
        if (c==2)
        {
            f>>pz>>nr;
            update(1,n,pz,pz+nr-1,1,2);
        }
        if (c==3)
        {
            g<<arb[1]<<'\n';
        }
    }
}