Cod sursa(job #3152513)

Utilizator Turcanu_DavidTurcanu David Turcanu_David Data 25 septembrie 2023 14:20:31
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <fstream>
#define int long long

using namespace std;

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

struct node
{
    int maxim, st, dr;
    int lazy;
};

node tree[800005];

void propagation(int node, int st, int dr)
{
    if(tree[node].lazy != 0)
    {
        int val=0;
        if(tree[node].lazy == -1)
        {
            val=dr-st+1;
        }
        tree[node].st=val;
        tree[node].dr=val;
        tree[node].maxim=val;
        if(st != dr)
        {
            tree[node*2+1].lazy=tree[node].lazy;
            tree[node*2+2].lazy=tree[node].lazy;
        }
        tree[node].lazy=0;
    }
}

void update(int node, int st, int dr, int qst, int qdr, bool added) // added true => se cazeaza; false => pleaca
{
    // prop
    propagation(node, st, dr);

    if(dr < qst || qdr < st)
    {
        return;
    }

    if(qst <= st && dr <= qdr)
    {
        // prop
        int val=0;
        if(!added)
            val=dr-st+1;
        tree[node].st=val;
        tree[node].dr=val;
        tree[node].maxim=val;
        int val0=-1;
        if(added)
            val0=1;
        if(st != dr)
        {
            tree[node*2+1].lazy=val0;
            tree[node*2+2].lazy=val0;
        }
        return;
    }

    int mid=(st+dr)/2;
    update(node*2+1, st, mid, qst, qdr, added);
    update(node*2+2, mid+1, dr, qst, qdr, added);

    tree[node].maxim=max(tree[node*2+1].dr+tree[node*2+2].st, max(tree[node*2+1].maxim, tree[node*2+2].maxim));
    tree[node].st=tree[node*2+1].st;
    if(tree[node*2+1].st == mid-st+1) // e tot nodul
        tree[node].st+=tree[node*2+2].st;
    tree[node].dr=tree[node*2+2].dr;
    if(tree[node*2+2].dr == dr-mid) // e tot nodul
        tree[node].dr+=tree[node*2+1].dr;
}

int32_t main()
{
    int n, q;
    cin>>n>>q;
    for(int i=1; i<=n; i++)
    {
        update(0, 1, n, i, i, false);
    }
    int c, i, m;
    while(q--)
    {
        cin>>c;
        // i - m+i-1
        if(c == 1)
        {
            cin>>i>>m;
            update(0, 1, n, i, m+i-1, true);
        }
        if(c == 2)
        {
            cin>>i>>m;
            update(0, 1, n, i, m+i-1, false);
        }
        if(c == 3)
        {
            cout<<tree[0].maxim<<'\n';
        }
    }
    return 0;
}