Cod sursa(job #2866845)

Utilizator Tudor06MusatTudor Tudor06 Data 10 martie 2022 00:23:49
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <bits/stdc++.h>

using namespace std;

struct aint {
    int l;
    int pref;
    int suf;
    int lazy;
    int st;
    int dr;
    aint* left;
    aint* right;
};

aint* makesons( aint* root ) {
    int st = root->st, dr = root->dr, mij = ( st + dr ) / 2;
    if ( root->left == NULL ) {
        root->left = new aint {
            mij - st + 1,
            mij - st + 1,
            mij - st + 1,
            -1,
            st,
            mij,
            NULL,
            NULL,
        };
    }
    if ( root->right == NULL ) {
        root->right = new aint {
            dr - mij,
            dr - mij,
            dr - mij,
            -1,
            mij + 1,
            dr,
            NULL,
            NULL,
        };
    }
    return root;
}
aint* propag( aint* root ) {
    if ( root->lazy == -1 )
        return root;
    int st = root->st, dr = root->dr, mij = ( st + dr ) / 2;

    root->left->l = root->left->pref = root->left->suf = ( mij - st + 1 ) * root->lazy;
    root->left->lazy = root->lazy;

    root->right->l = root->right->pref = root->right->suf = ( dr - mij ) * root->lazy;
    root->right->lazy = root->lazy;

    root->lazy = -1;
    return root;
}
aint* update( aint* root, int a, int b, int val ) {
    root = makesons( root );
    root = propag( root );
    int st = root->st, dr = root->dr, mij = ( st + dr ) / 2;
//    cout << st << ' ' << dr << ' ' << a << ' ' << b << endl;
    if ( st == a && dr == b ) {
        root->l = root->pref = root->suf = ( dr - st + 1 ) * val;
        root->lazy = val;
        return root;
    }
    if ( b <= mij )
        root->left = update( root->left, a, b, val );
    else if ( a > mij )
        root->right = update( root->right, a, b, val );
    else {
        root->left = update( root->left, a, mij, val );
        root->right = update( root->right, mij + 1, b, val );
    }
    root->l = max( { root->left->l, root->right->l, root->left->suf + root->right->pref } );

    root->pref = root->left->pref;
    if ( root->pref == mij - st + 1 )
        root->pref += root->right->pref;

    root->suf = root->right->suf;
    if ( root->suf == dr - mij )
        root->suf += root->left->suf;
    return root;
}
int main() {
    ifstream fin( "hotel.in" );
    ofstream fout( "hotel.out" );
    int n, i, q;
    fin >> n >> q;
    aint* root = new aint {
        n,
        n,
        n,
        -1,
        0,
        n - 1,
        NULL,
        NULL,
    };
    for ( i = 0; i < q; i ++ ) {
        int tip;
        fin >> tip;
        if ( tip == 3 )
            fout << root->l << '\n';
        else {
            int st, dr;
            fin >> st >> dr;
            root = update( root, st - 1, st - 1 + dr - 1, tip - 1 );
        }
    }
    return 0;
}