Cod sursa(job #3161057)

Utilizator AlexSerban21Serban Alexandru AlexSerban21 Data 25 octombrie 2023 17:30:24
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <fstream>
using namespace std;
ifstream fin ("hotel.in");
ofstream fout ("hotel.out");
int t,ch,val,x,y,n,q,i;
struct el
{
    int maxim,sumdr,sumst,sum,lazy;
};
el aint[400001];
void f (int nod,int st,int dr)
{
    int mij=(st+dr)/2;
    aint[nod].sumst=aint[2*nod].sumst;
    if (aint[2*nod].sum==mij-st+1)
        aint[nod].sumst+=aint[2*nod+1].sumst;
    aint[nod].sumdr=aint[2*nod+1].sumdr;
    if (aint[2*nod+1].sum==dr-mij)
        aint[nod].sumdr+=aint[2*nod].sumdr;
    aint[nod].sum=aint[2*nod].sum+aint[2*nod+1].sum;
    aint[nod].maxim=max (aint[2*nod].sumdr+aint[2*nod+1].sumst,max (aint[2*nod].maxim,aint[2*nod+1].maxim));
}
void propagate (int nod,int st,int dr)
{
    if (st!=dr&&aint[nod].lazy!=0)
    {
        int mij=(st+dr)/2;
        int val=aint[nod].lazy;
        int v=val;
        if (v==-1)
            v++;
        aint[2*nod].sum=aint[2*nod].maxim=aint[2*nod].sumst=aint[2*nod].sumdr=(mij-st+1)*v;
        aint[2*nod+1].sum=aint[2*nod+1].maxim=aint[2*nod+1].sumst=aint[2*nod+1].sumdr=(dr-mij)*v;
        aint[2*nod].lazy=aint[2*nod+1].lazy=val;
    }
    aint[nod].lazy=0;
}
void build (int nod,int st,int dr)
{
    if (st==dr)
        aint[nod].sum=aint[nod].maxim=aint[nod].sumst=aint[nod].sumdr=1;
    else
    {
        int mij=(st+dr)/2;
        build (2*nod,st,mij);
        build (2*nod+1,mij+1,dr);
        f (nod,st,dr);
    }
}
void update (int nod,int st,int dr)
{
    propagate (nod,st,dr);
    if (st>=x&&dr<=y)
    {
        aint[nod].lazy=val;
        int v=val;
        if (v==-1)
            v++;
        aint[nod].sum=aint[nod].maxim=aint[nod].sumst=aint[nod].sumdr=(dr-st+1)*v;
    }
    else
    {
        int mij=(st+dr)/2;
        if (x<=mij)
            update (2*nod,st,mij);
        if (y>mij)
            update (2*nod+1,mij+1,dr);
        f (nod,st,dr);
    }
}
int main ()
{
    fin>>n>>q;
    build (1,1,n);
    for (t=1; t<=q; t++)
    {
        fin>>ch;
        if (ch==1)
        {
            fin>>x>>y;
            y=x+y-1;
            val=-1;
            update (1,1,n);
        }
        else if (ch==2)
        {
            fin>>x>>y;
            y=x+y-1;
            val=1;
            update (1,1,n);
        }
        else if (ch==3)
            fout<<aint[1].maxim<<"\n";
    }
    return 0;
}