Cod sursa(job #2777299)

Utilizator NeuerRaducu Ioan Stefan Neuer Data 22 septembrie 2021 20:45:06
Problema Hotel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.37 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;
const int SIZE = 1e5+10;

ifstream in("hotel.in");
ofstream out("hotel.out");

struct interval
{
    int maxim;
    int left, right;
    bool isLazy;
    bool isFull;
};

int n, m;
interval arb[SIZE*4];
int qry, a, b;
bool on;

void coutInterval(int ind, int st, int dr)
{
    cout<<"arb de "<<st<<" "<<dr<<" = vvv\n";
    cout<<"maxim = "<<arb[ind].maxim<<"\n";
    cout<<"left = "<<arb[ind].left<<"\n";
    cout<<"right = "<<arb[ind].right<<"\n";
    cout<<"isLazy = "<<arb[ind].isLazy<<"\n";
    if(arb[ind].isLazy) cout<<"isFull = "<<arb[ind].isFull<<"\n";
    cout<<"&&&\n\n";
}

void coutArb(int ind, int st, int dr)
{
    coutInterval(ind, st, dr);
    if(st>=dr) return;
    int mid = (st + dr) / 2;
    coutArb(ind*2, st, mid);
    coutArb(ind*2+1, mid+1, dr);
}

void lazyUpdate(int ind, int st, int dr)
{
    if(arb[ind].isLazy)
    {
        arb[ind].left = arb[ind].right = arb[ind].maxim = arb[ind].isFull;
        arb[ind].isLazy = 0;
        if(st<dr)
        {
            arb[ind*2].isLazy = 1;
            arb[ind*2+1].isLazy = 1;
            arb[ind*2].isFull = arb[ind].isFull;
            arb[ind*2+1].isFull = arb[ind].isFull;
            int mid = (st + dr) / 2;
            arb[ind*2].maxim = arb[ind*2].left = arb[ind*2].right = arb[ind].isFull*(mid-st+1);
            arb[ind*2+1].maxim = arb[ind*2+1].left = arb[ind*2+1].right = arb[ind].isFull*(dr-mid);
        }
    }

    if(a<=st && dr<=b)
    {
        arb[ind].isFull = on;
        arb[ind].maxim = on*(dr-st+1);
        arb[ind].left = on*(dr-st+1);
        arb[ind].right = on*(dr-st+1);
        arb[ind*2].isLazy = arb[ind*2+1].isLazy = 1;
        arb[ind*2].isFull = arb[ind*2+1].isFull = on;
        return;
    }

    if(st>=dr) return;

    int mid = (st + dr) / 2;
    if(a<=mid) lazyUpdate(ind*2, st, mid);
    if(b>mid) lazyUpdate(ind*2+1, mid+1, dr);

    arb[ind].left = arb[ind*2].left;
    if(arb[ind*2].maxim == mid-st+1) arb[ind].left += arb[ind*2+1].left;
    arb[ind].right = arb[ind*2+1].right;
    if(arb[ind*2+1].maxim == dr-mid) arb[ind].right += arb[ind*2].right;
    arb[ind].maxim = max(arb[ind*2].right+arb[ind*2+1].left, max(arb[ind*2].maxim, arb[ind*2+1].maxim));

}

void setArb(int ind, int st, int dr)
{
    arb[ind].left = arb[ind].right = arb[ind].maxim = dr-st+1;
    if(st==dr) return;
    int mid = (st + dr) / 2;
    setArb(ind*2, st, mid), setArb(ind*2+1,  mid+1, dr);
}

void readit()
{
    in>>n>>m;
    setArb(1, 1, n);
    for(int i=1; i<=m; i++)
    {
        in>>qry;
        if(qry==1)
        {
            in>>a>>b;
            b+=a-1;
            ///cout<<"#"<<a<<' '<<b<<'\n';
            on=0;
            lazyUpdate(1, 1, n);
            ///coutArb(1, 1, n);
            ///return;
        }
        else if(qry==2)
        {
            in>>a>>b;
            b+=a-1;
            on=1;
            lazyUpdate(1, 1, n);
        }
        else
        {
            out<<arb[1].maxim<<'\n';
        }
    }
}

/// 0   1   1   1   0   0   0   0   0   0   0   0
/// 0   1   1   1   0   0   0   0   1   1   1   1
/// 0   0   1   1   0   0   0   0   1   1   1   1
/// 0   0   1   1   0   0   0   0   0   0   1   1
/// 0   1   0   0   0   0   0   0   0   0   1   1

int main()
{
    readit();
    return 0;
}