Cod sursa(job #2965854)

Utilizator Zed1YasuoAlex Birsan Zed1Yasuo Data 16 ianuarie 2023 13:19:06
Problema Hotel Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int n,q,t,x,y;
const int N=1e5+3;
struct pct
{
    int mxl,mxr;
    int mx;
}a[4*N];
void build(int nod,int st,int dr)
{
    if(st==dr)
        a[nod]={1,1,1};
    else
    {
        int mij=(st+dr)/2;
        a[nod]={dr-st+1,dr-st+1,dr-st+1};
        build(nod*2,st,mij);
        build(nod*2+1,mij+1,dr);
    }
}
void add(int nod,int st,int dr,int qst,int qdr)
{
    if(a[nod].mx==dr-st+1)
    {
        int mj=(st+dr)/2;
        a[nod*2+1]={dr-mj,dr-mj,dr-mj};
        a[nod*2]={mj-st+1,mj-st+1,mj-st+1};
    }
    if(qst<=st&&dr<=qdr)
    {
      //  g<<qst<<" "<<qdr<<"   "<<st<<" "<<dr<<'\n';
        a[nod]={0,0,0};
    }
    else
    {
        int mj=(st+dr)/2;
        if(mj>=qst)
            add(nod*2,st,mj,qst,qdr);
        if(mj<qdr)
            add(nod*2+1,mj+1,dr,qst,qdr);
        pct l=a[nod*2];
        pct r=a[nod*2+1];
        a[nod].mx=max(max(l.mx,r.mx),l.mxr+r.mxl);
        if(l.mxl==mj-st+1)
            a[nod].mxl=l.mxl+r.mxl;
        else
            a[nod].mxl=l.mxl;
        if(r.mxr==dr-mj)
            a[nod].mxr=r.mxr+l.mxr;
        else
            a[nod].mxr=r.mxr;
    }
}
void leaf(int nod,int st,int dr,int qst,int qdr)
{
    if(a[nod].mx==0)
    {
        a[nod*2+1]=a[nod*2]={0,0,0};
    }
    if(qst<=st&&dr<=qdr)
    {
        a[nod]={dr-st+1,dr-st+1,dr-st+1};
    }
    else
    {
        int mj=(st+dr)/2;
        if(mj>=qst)
            leaf(nod*2,st,mj,qst,qdr);
        if(mj<qdr)
            leaf(nod*2+1,mj+1,dr,qst,qdr);
        pct l=a[nod*2];
        pct r=a[nod*2+1];
        a[nod].mx=max(max(l.mx,r.mx),l.mxr+r.mxl);
        if(l.mxl==mj-st+1)
            a[nod].mxl=l.mxl+r.mxl;
        else
            a[nod].mxl=l.mxl;
        if(r.mxr==dr-mj)
            a[nod].mxr=r.mxr+l.mxr;
        else
            a[nod].mxr=r.mxr;


    }
}
int main()
{
    f>>n>>q;
    build(1,1,n);
    while(q--)
    {
        f>>t;
        if(t==1)
        {
            f>>x>>y;
            add(1,1,n,x,x+y-1);
        }
        else
        if(t==2)
        {
            f>>x>>y;
            leaf(1,1,n,x,x+y-1);
        }
        else
        {
            g<<a[1].mx<<'\n';
        }
    }
    return 0;
}