Cod sursa(job #3121839)

Utilizator Zed1YasuoAlex Birsan Zed1Yasuo Data 15 aprilie 2023 16:59:28
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <fstream>

using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int n,m;
const int N=1e5+5;

struct pct
{
    int val,left,right,lz;
} a[4*N];
void update_nod(int nod,int st,int dr)
{
    int mj=(st+dr)/2;
    if(a[nod*2].left==mj-st+1)
        a[nod].left=a[nod*2].left+a[nod*2+1].left;
    else
        a[nod].left=a[nod*2].left;
    if(a[nod*2+1].right==dr-mj)
        a[nod].right=a[nod*2+1].right+a[nod*2].right;
    else
        a[nod].right=a[nod*2+1].right;
    a[nod].val=max(a[nod*2].val,max(a[nod*2+1].val,a[nod*2].right+a[nod*2+1].left));

}
void prag(int nod,int st,int dr)
{
    int mj=(st+dr)/2;
    if(a[nod].lz==1)
    {
        a[nod].lz=0;
        int s=nod*2;
        a[s].val=a[s].left=a[s].right=mj-st+1;
        a[s].lz=1;
        s=nod*2+1;
        a[s].val=a[s].left=a[s].right=dr-mj;
        a[s].lz=1;
    }
    else if(a[nod].lz==-1)
    {
        a[nod].lz=0;
        int s=nod*2;
        a[s].val=a[s].left=a[s].right=0;
        a[s].lz=-1;
        s=nod*2+1;
        a[s].val=a[s].left=a[s].right=0;
        a[s].lz=-1;
    }
}
void update(int nod,int st,int dr,int qst,int qdr,int tip)
{
    if(qst<=st&&dr<=qdr)
    {
        if(tip==1)
        {
            a[nod].val=dr-st+1;
            a[nod].left=dr-st+1;
            a[nod].right=dr-st+1;
            a[nod].lz=1;
        }
        else
        {
            a[nod].val=a[nod].left=a[nod].right=0;
            a[nod].lz=-1;
        }
        return;
    }
    prag(nod,st,dr);
    int mj=(st+dr)/2;
    if(mj>=qst)
        update(nod*2,st,mj,qst,qdr,tip);
    if(mj<qdr)
        update(nod*2+1,mj+1,dr,qst,qdr,tip);
    update_nod(nod,st,dr);
}
void build(int nod,int st,int dr)
{
    int mj=(st+dr)/2;
    a[nod].val=a[nod].left=a[nod].right=dr-st+1;
    if(st!=dr)
    {
        build(nod*2,st,mj);
        build(nod*2+1,mj+1,dr);
    }
}
int main()
{
    f>>n>>m;
    int t,x,y;
    build(1,1,n);
    while(m--)
    {
        f>>t;
        if(t==1)
        {
            f>>x>>y;
            update(1,1,n,x,x+y-1,-1);
        }
        else
        if(t==2)
        {
            f>>x>>y;
            update(1,1,n,x,x+y-1,1);
        }
        else
            g<<a[1].val<<'\n';
    }
    return 0;
}