Cod sursa(job #3154037)

Utilizator StefanL2005Stefan Leustean StefanL2005 Data 2 octombrie 2023 19:56:41
Problema Hotel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.35 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>
#include <algorithm>
using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");

struct seq{
    int dp, st, m;
    int carry = -1; // 0 daca umplem camerele 1 daca le eliberam, -1 daca nimic
};

void init(int node, int l, int r, vector<seq> &tree)
{
    if (l == r)
    {
        tree[node].dp = 1;
        tree[node].st = 1;
        tree[node].m = 1;
    }
    else
    {
        int mij = (l + r) / 2;

        init(2*node, l, mij, tree);
        init(2*node + 1, mij + 1, r, tree);

        if (tree[2*node].st == mij - l + 1)
            tree[node].st = tree[2*node].st + tree[2*node + 1].st;
        else
            tree[node].st = tree[2*node].st;

        if (tree[2*node + 1].dp == r - mij)
            tree[node].dp = tree[2*node + 1].dp + tree[2*node].dp;
        else
            tree[node].dp = tree[2*node + 1].dp;

        tree[node].m = max(tree[2*node].m, max(tree[2*node + 1].m, tree[2*node].dp + tree[2*node + 1].st));
    }
}

void room_oper(int type, int node, int l, int r, int ql, int qr, vector<seq> &tree)
{
    if (ql <= l && r <= qr)
    {
        switch(type)
        {
            case 1:{
                tree[node].st = 0;
                tree[node].dp = 0;
                tree[node].m = 0;
                tree[node].carry = 0;
            break;}
            case 2:{
                tree[node].st = r - l + 1;
                tree[node].dp = r - l + 1;
                tree[node].m = r - l + 1;
                tree[node].carry = 1;
            break;}
        }
    }
    else
    {
        int mij = (l + r) / 2;

       switch(tree[node].carry)
        {
            case 0:{
                tree[2*node].st = 0; tree[2*node].dp = 0; tree[2*node].m = 0;
                tree[2*node + 1].st = 0; tree[2*node].dp = 0; tree[2*node + 1].m = 0;
                tree[2*node].carry = 0; tree[2*node + 1].carry = 0;
                tree[node].carry = -1;
            break;}

            case 1:{ int l1 = mij - l + 1, l2 = r - mij;
                tree[2*node].st = l1; tree[2*node].dp = l1; tree[2*node].m = l1;
                tree[2*node + 1].st = l2; tree[2*node].dp = l2; tree[2*node + 1].m = l2;
                tree[2*node].carry = 1; tree[2*node + 1].carry = 1;
                tree[node].carry = -1;
            break;}
        }
        
        if (ql <= mij)
            room_oper(type, 2*node, l, mij, ql, qr, tree);
        if (mij + 1 <= qr)
            room_oper(type, 2*node + 1, mij + 1, r, ql, qr, tree);


        if (tree[2*node].st == mij - l + 1)
            tree[node].st = tree[2*node].st + tree[2*node + 1].st;
        else
            tree[node].st = tree[2*node].st;

        if (tree[2*node + 1].dp == r - mij)
            tree[node].dp = tree[2*node + 1].dp + tree[2*node].dp;
        else
            tree[node].dp = tree[2*node + 1].dp;

        tree[node].m = max(tree[2*node].m, max(tree[2*node + 1].m, tree[2*node].dp + tree[2*node + 1].st));
    }
}

int main()
{
    int n, Q;
    in>> n >> Q;
    vector<seq> tree(4 * n);
    init(1, 0, n - 1, tree);

    for (int question = 0; question < Q; question++)
    {
        int type;
        in>> type;

        if (type == 3)
        {
            out<< tree[1].m << "\n";
            continue;
        }
        int a, b;
        in>> a >> b;

        room_oper(type, 1, 0, n - 1, a - 1, a + b - 2, tree);
    }
    return 0;
}