Cod sursa(job #2465813)

Utilizator deiubejanAndrei Bejan deiubejan Data 30 septembrie 2019 21:21:33
Problema Hotel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <bits/stdc++.h>
using namespace std;

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


#define cin fin
#define cout fout
/*
*/

const int NMAX=(2<<19);
int n, m;
struct t
{
    int st, dr, maxi;
    bool updated;
}arbore[NMAX];


void update(int val, int intLeft, int intRight, int auxLeft, int auxRight, int nod)
{
    if(intLeft<=auxLeft&&auxRight<=intRight)
    {
        int aux=val*(auxRight-auxLeft+1);

        arbore[nod]={aux, aux, aux, 1};
        return;
    }

    int mij=(auxLeft+auxRight)/2;

    if(arbore[nod].updated)
    {
        arbore[nod].updated=0;

        bool aux=arbore[nod].maxi;
        int valLeft=aux*(mij-auxLeft+1);
        int valRight=aux*(auxRight-mij);

        arbore[2*nod]={valLeft, valLeft, valLeft, 1};
        arbore[2*nod+1]={valRight, valRight, valRight, 1};
    }

    if(intLeft<=mij)
        update(val, intLeft, intRight, auxLeft, mij, 2*nod);
    if(mij<intRight)
        update(val, intLeft, intRight, mij+1, auxRight, 2*nod+1);

    arbore[nod].st=arbore[2*nod].st;
    if(arbore[2*nod].st==mij-auxLeft+1)
        arbore[nod].st+=arbore[2*nod+1].st;

    arbore[nod].dr=arbore[2*nod+1].dr;
    if(arbore[2*nod+1].dr==auxRight-mij)
        arbore[nod].dr+=arbore[2*nod].dr;

    arbore[nod].maxi=arbore[2*nod].dr+arbore[2*nod+1].st;
    arbore[nod].maxi=max(arbore[nod].maxi, arbore[nod].st);
    arbore[nod].maxi=max(arbore[nod].maxi, arbore[nod].dr);
}

int main()
{
    int caz, left, right;
    cin>>n>>m;
    update(1,1,n,1,n,1);
    for(int i=1; i<=m; i++)
    {
        cin>>caz;
        if(caz==1)
        {
            cin>>left>>right;
            right=left+right-1;
            update(0, left, right, 1, n, 1);
        }
        else
        if(caz==2)
        {
            cin>>left>>right;
            right=left+right-1;
            update(1, left, right, 1, n, 1);
        }
        else
            cout<<arbore[1].maxi<<"\n";
    }


    return 0;
}