Cod sursa(job #2005728)

Utilizator LucaSeriSeritan Luca LucaSeri Data 27 iulie 2017 23:48:15
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.88 kb
#include <fstream>

using namespace std;

ifstream f("hotel.in");
ofstream g("hotel.out");

const int MaxN = 100005;
class Aint{
public:
    void Solve(){
        int n;
        f >> n;
        Start(1, 1, n);
        int p;
        f >> p;
        for(int t; p; --p){
            f >> t;
            if(t == 1){
                int a, b;
                f >> a >> b;
                Range_Fill(1, 1, n, a, a+b-1);
            }
            else if(t == 2){
                int a, b;
                f >> a >> b;
                Range_Empty(1, 1, n, a, a+b-1);
            }
            else{
                int ans = max(l[1], r[1]);
                ans = max(ans, mid[1]);
                g << ans << '\n';
            }
        }
    }

private:
    int r[MaxN<<2], mid[MaxN<<2], l[MaxN<<2];
    bool Lazy[MaxN<<2];
    void Start(int node, int st, int dr){
        Lazy[node] = 0;
        l[node] = r[node] = mid[node] = dr-st+1;
        if(st == dr) return;
        int mij = st+dr>>1;
        Start(node<<1, st, mij);
        Start(node<<1|1, mij+1, dr);
    }

    void Range_Fill(int node, int st, int dr, int a, int b){
        if(st >= a && dr <= b){
            l[node] = r[node] = mid[node] = 0;
            Lazy[node] = 1;
            return;
        }

        int mij = st+dr>>1;
        if(mij >= a) Range_Fill(node<<1, st, mij, a, b);
        if(mij < b) Range_Fill(node<<1|1, mij+1, dr, a, b);

        if(l[node<<1] == mij-st+1){
            l[node] = l[node<<1] + l[node<<1|1];
        }
        else l[node] = l[node<<1];

        if(r[node<<1|1] == dr-mij){
            r[node] = r[node<<1] + r[node<<1|1];
        }
        else r[node] = r[node<<1|1];

        mid[node] = max(mid[node<<1|1], mid[node<<1]);
        mid[node] = max(mid[node], r[node<<1] + l[node<<1|1]);
    }

    void Range_Empty(int node, int st, int dr, int a, int b){
        if(st >= a && dr <= b){
            l[node] = r[node] = mid[node] = dr-st+1;
            Lazy[node] = 0;
            return;
        }

        int mij = st+dr>>1;
        if(Lazy[node]) {
                Lazy[node<<1] = Lazy[node<<1|1] = 1;
                Range_Fill(node<<1, st, mij, st, mij);
                Range_Fill(node<<1|1, mij+1, dr, mij+1, dr);
                Lazy[node] = 0;
        }
        if(mij >= a) Range_Empty(node<<1, st, mij, a, b);
        if(mij < b) Range_Empty(node<<1|1, mij+1, dr, a, b);

        if(l[node<<1] == mij-st+1){
            l[node] = l[node<<1] + l[node<<1|1];
        }
        else l[node] = l[node<<1];

        if(r[node<<1|1] == dr-mij){
            r[node] = r[node<<1] + r[node<<1|1];
        }
        else r[node] = r[node<<1|1];

        mid[node] = max(mid[node<<1|1], mid[node<<1]);
        mid[node] = max(mid[node], r[node<<1] + l[node<<1|1]);
    }
}Arbore;


int main()
{
    Arbore.Solve();
    return 0;
}