Cod sursa(job #3131551)

Utilizator fabian_anghelFabian Anghel fabian_anghel Data 20 mai 2023 15:33:14
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <fstream>
using namespace std;
long long P,N,arb[800001],a,b,c,lsum[800001],rsum[800001],add[800001];
ifstream f ("hotel.in");
ofstream g ("hotel.out");
void build(int nod,int st, int dr)
{
    arb[nod]=dr-st+1;
    lsum[nod]=dr-st+1;
    rsum[nod]=dr-st+1;
    if(st<dr)
    {
        int mij=(st+dr)/2;
        build(2*nod,st,mij);
        build(2*nod+1,mij+1,dr);
    }
}
void upd(int nod,int st,int dr,int a,int b,int val)
{
    if(a<=st && dr<=b)
    {
        add[nod]=val;
        if(val==1)
        {
            arb[nod]=dr-st+1;
            lsum[nod]=dr-st+1;
            rsum[nod]=dr-st+1;
        }
        else
        {
            arb[nod]=0;
            lsum[nod]=0;
            rsum[nod]=0;
        }
    }
    else
    {
        int mij=(st+dr)/2;
        if(add[nod]==1)
        {
            arb[2*nod]=mij-st+1;
            lsum[2*nod]=mij-st+1;
            rsum[2*nod]=mij-st+1;
            arb[2*nod+1]=dr-mij;
            lsum[2*nod+1]=dr-mij;
            rsum[2*nod+1]=dr-mij;
            add[2*nod]=1;
            add[2*nod+1]=1;
        }
        else if(add[nod]==-1)
        {
            arb[2*nod]=0;
            lsum[2*nod]=0;
            rsum[2*nod]=0;
            arb[2*nod+1]=0;
            lsum[2*nod+1]=0;
            rsum[2*nod+1]=0;
            add[2*nod]=-1;
            add[2*nod+1]=-1;
        }
        add[nod]=0;
        if(a<=mij)
            upd(2*nod,st,mij,a,b,val);
        if(mij<b)
            upd(2*nod+1,mij+1,dr,a,b,val);
        if(lsum[2*nod]==mij-st+1)
            lsum[nod]=lsum[2*nod]+lsum[2*nod+1];
        else
            lsum[nod]=lsum[2*nod];
        if(rsum[2*nod+1]==dr-mij)
            rsum[nod]=rsum[2*nod]+rsum[2*nod+1];
        else
            rsum[nod]=rsum[2*nod+1];
        arb[nod]=max(max(arb[2*nod],arb[2*nod+1]),rsum[2*nod]+lsum[2*nod+1]);
    }
}
int main()
{
    f>>N>>P;
    build(1,1,N);
    for(int i=1;i<=P;i++)
    {
        f>>c;
        if(c==3)
            g<<arb[1]<<'\n';
        else
        {
            f>>a>>b;
            upd(1,1,N,a,a+b-1,2*c-3);
        }
    }
    f.close();
    g.close();
    return 0;
}