Cod sursa(job #3265754)

Utilizator popuPop Matei Tudor popu Data 2 ianuarie 2025 22:22:02
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <bits/stdc++.h>

#define ll long long

using namespace std;

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

const int nmax = 1e5;

struct nod
{
    int left, longest, right;
};

struct COPAC
{
    int n;
    int lazy[4 * nmax];
    nod v[4 * nmax];

    void init(int n)
    {
        this->n = 1 << (32 - __builtin_clz(n));
        for(int i = 1; i < 2 * n; i++)
            lazy[i] = -1;
    }

    void push(int node, int len)
    {
        if(lazy[node] != -1) {
            int group = len * lazy[node];
            v[node] = {group, group, group};
            if(node < n)
                lazy[2 * node] = lazy[2 * node + 1] = lazy[node];
            lazy[node] = -1;
        }
    }

    void pull(int node, int len)
    {
        if(v[2 * node].left == len / 2)
            v[node].left = len / 2 + v[2 * node + 1].left;
        else
            v[node].left = v[2 * node].left;

        if(v[2 * node + 1].right == len / 2)
            v[node].right = len / 2 + v[2 * node].right;
        else
            v[node].right = v[2 * node + 1].right;
        v[node].longest = max({v[2 * node].longest, v[2 * node + 1].longest, v[2 * node].left, v[2 * node + 1].right, v[2 * node].right + v[2 * node + 1].left});
    }

    void updateHelp(int node, int l, int r, int pl, int pr, int val) ///[0, n)
    {
        push(node, pr - pl);
        if(l >= r)
            return;
        if(pl == l && pr == r) {
            lazy[node] = val;
            push(node, pr - pl);
            return;
        }
        int mid = (pl + pr) >> 1;
        updateHelp(2 * node, l, min(r, mid), pl, mid, val);
        updateHelp(2 * node + 1, max(l, mid), r, mid, pr, val);
        pull(node, pr - pl);
    }

    int query() ///longest sequence of 1
    {
        push(1, n / 2);
        return v[1].longest;
    }

    void update(int l, int len, int val) ///from [1, n] go to [0, n)
    {
        updateHelp(1, l - 1, l + len - 1, 0, n, val);
    }
}aint;

int main()
{
    int n, q;
    fin >> n >> q;
    aint.init(n);
    aint.update(1, n, 1);
    while(q--) {
        int c;
        fin >> c;
        if(c == 3)
            fout << aint.query() << '\n';
        else {
            int l, m;
            fin >> l >> m;
            aint.update(l, m, c - 1); ///switch 1 and 0
        }
    }

    return 0;
}