Cod sursa(job #2960562)

Utilizator SerbanCaroleSerban Carole SerbanCarole Data 4 ianuarie 2023 17:50:33
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.35 kb
#include <fstream>
using namespace std;

//////////////////////////////////////

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

const int MAX = 1e5 + 1;

struct a{

    int sf , pf , maxz , lazy;

}aint[4*MAX];

int n , q , a , b , op;

/////////////////////////////////////////////

void update_node( int nod , int st , int dr){

    if( st < dr ){

        int m = (st+dr)/2;

        aint[nod].maxz = max(aint[nod*2].sf + aint[nod*2+1].pf ,max(aint[nod*2].maxz,aint[nod*2+1].maxz));
        if(aint[nod*2+1].maxz == (dr-m)) aint[nod].sf = aint[nod*2].sf + (dr-m);
        else aint[nod].sf = aint[nod*2+1].sf;
        if(aint[nod*2].maxz == (m-st+1)) aint[nod].pf = aint[nod*2+1].pf + (m-st+1);
        else aint[nod].pf = aint[nod*2].pf;
    }

}

void init( int nod , int st , int dr){

    if(st==dr){

        aint[nod].sf = 1;
        aint[nod].pf = 1;
        aint[nod].maxz = 1;
        aint[nod].lazy = 0;

    }else{

        int mij = (st+dr)/2;

        init(nod*2,st,mij);
        init(nod*2+1,mij+1,dr);

        aint[nod].maxz = aint[nod*2].maxz + aint[nod*2+1].maxz;
        aint[nod].sf = aint[nod*2].sf + aint[nod*2+1].sf;
        aint[nod].pf = aint[nod*2].sf + aint[nod*2+1].sf;
        aint[nod].lazy = 0;
    }

}

void updatelazy( int nod , int st , int dr ){

    if(!aint[nod].lazy){

    }else if(aint[nod].lazy == 1){

        aint[nod].lazy = 0;

        aint[nod].maxz = 0;
        aint[nod].sf = 0;
        aint[nod].pf = 0;

        if(st!=dr){

            aint[nod*2].lazy = aint[nod*2+1].lazy = 1;
        }

    }else if(aint[nod].lazy == 2){

        aint[nod].lazy = 0;

        aint[nod].maxz = (dr-st+1);
        aint[nod].sf = (dr-st+1);
        aint[nod].pf = (dr-st+1);

        if(st!=dr){

            aint[nod*2].lazy = aint[nod*2+1].lazy = 2;
        }

    }

}

void update1( int nod , int st , int dr , int lst , int ldr){

    updatelazy(nod,st,dr);

    if( lst <= st && dr <= ldr ){

        aint[nod].lazy = 1;

        updatelazy(nod,st,dr);

    }else{

        int m = (st+dr)/2;

        if(lst <= m){

            update1(nod*2,st,m,lst,ldr);
        }
        if(ldr > m){

            update1(nod*2+1,m+1,dr,lst,ldr);
        }

        updatelazy(nod*2,st,m);
        updatelazy(nod*2+1,m+1,dr);

        update_node(nod,st,dr);

    }

}

void update2( int nod , int st , int dr , int lst , int ldr){

    updatelazy(nod,st,dr);

    if( lst <= st && dr <= ldr ){

        aint[nod].lazy = 2;

        updatelazy(nod,st,dr);

    }else{

        int m = (st+dr)/2;

        if(lst <= m){

            update2(nod*2,st,m,lst,ldr);
        }
        if(ldr > m){

            update2(nod*2+1,m+1,dr,lst,ldr);
        }

        updatelazy(nod*2,st,m);
        updatelazy(nod*2+1,m+1,dr);

        update_node(nod,st,dr);

    }

}

int main()
{

    cin >> n >> q;

    init(1,1,n);


    while(q--){

        cin >> op;

        if(op==3){

            cout <<aint[1].maxz << '\n';

        }
        if(op==1){

            cin >> a >> b;

            b+=a;
            b--;

            update1(1,1,n,a,b);
        }
        if(op==2){

            cin >> a >> b;

            b+=a;
            b--;

            update2(1,1,n,a,b);
        }
    }

    return 0;
}