제출 #1369525

#제출 시각아이디문제언어결과실행 시간메모리
1369525solution6312Garden 3 (JOI26_garden)C++17
0 / 100
101 ms56760 KiB
#include <iostream>
#include <cassert>
using namespace std;
using ll=long long;

const int MN=2e5+13;
const int inf32=1e9;
const ll inf64=1e18;
int H, W, N; ll X;

namespace seg
{
    int st[MN<<3], te[MN<<3], mid[MN<<3];
    ll mx[MN<<3], lz[MN<<3];
    int lp[MN<<3], rp[MN<<3], idx=0;
    int build(int l, int r)
    {
        int u=++idx;
        st[u]=l; te[u]=r; mid[u]=(st[u]+te[u])>>1;
        mx[u]=lz[u]=0;
        return u;
    }
    void build(int u)
    {
        if (!lp[u]) lp[u]=build(st[u], mid[u]);
        if (!rp[u]) rp[u]=build(mid[u]+1, te[u]);
    }
    void prop(int u)
    {
        if (!lz[u]) return;
        mx[lp[u]]+=lz[u];
        lz[lp[u]]+=lz[u];
        mx[rp[u]]+=lz[u];
        lz[rp[u]]+=lz[u];
        lz[u]=0;
    }
    void upd(int u, int l, int r, ll x)
    {
        if (st[u]==l && te[u]==r)
        {
            mx[u]+=x;
            lz[u]+=x;
            return;
        }
        build(u);
        prop(u);
        if (l<=mid[u]) upd(lp[u], l, min(r, mid[u]), x);
        if (r>mid[u]) upd(rp[u], max(mid[u]+1, l), r, x);
        mx[u]=max(mx[lp[u]], mx[rp[u]]);
    }
    int qrymin(int u)
    {
        if (mx[u]<X) return inf32;
        if (st[u]==te[u]) return st[u];
        build(u);
        prop(u);
        if (mx[lp[u]]>=X) return qrymin(lp[u]);
        else return qrymin(rp[u]);
    }
    int qrymax(int u)
    {
        if (mx[u]<X) return -inf32;
        if (st[u]==te[u]) return st[u];
        build(u);
        prop(u);
        if (mx[rp[u]]>=X) return qrymax(rp[u]);
        else return qrymax(lp[u]);
    }
}

int main()
{
    cin>>H>>W>>N>>X;
    assert(W==1);
    seg::build(1, H);
    while (N--)
    {
        int U, D, L, R; ll C; cin>>U>>D>>L>>R>>C;
        assert(L==1 && R==1);
        seg::upd(1, U, D, C);
        ll minpos=seg::qrymin(1), maxpos=seg::qrymax(1);
        if (minpos==inf32)
        {
            assert(maxpos==-inf32);
            cout<<0<<endl;
        }
        else cout<<maxpos-minpos+1<<endl;
    }
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…