제출 #713545

#제출 시각아이디문제언어결과실행 시간메모리
713545four_specks원숭이와 사과 나무 (IZhO12_apple)C++17
100 / 100
39 ms3036 KiB
#include <bits/stdc++.h>

using namespace std;

namespace
{
    struct SegTree
    {
        SegTree() {}
        SegTree(long _l, long _r) : l(_l), r(_r), val(0), lz(0) {}

        long l, r;
        long val;
        bool lz;

        unique_ptr<SegTree> lc, rc;

        void pull()
        {
            val = 0;
            if (lc)
                val += lc->val;
            if (rc)
                val += rc->val;
        }

        void update(long pl, long pr)
        {
            if (r <= pl || pr <= l)
                return;

            if (lz)
                return;

            if (pl <= l && r <= pr)
            {
                lz = 1;
                val = r - l;
                return;
            }

            long mid = (l + r) / 2;

            if (!lc)
                lc = make_unique<SegTree>(l, mid);
            lc->update(pl, pr);

            if (!rc)
                rc = make_unique<SegTree>(mid, r);
            rc->update(pl, pr);

            pull();
        }

        long query(long pl, long pr)
        {
            if (r <= pl || pr <= l)
                return 0;

            if (pl <= l && r <= pr)
                return val;

            if (lz)
                return min(r, pr) - max(l, pl);

            long ret = 0;
            if (lc)
                ret += lc->query(pl, pr);
            if (rc)
                ret += rc->query(pl, pr);

            return ret;
        }
    };

} // namespace

void solve()
{
    int m;
    cin >> m;

    long c = 0;
    SegTree st(1, 1'000'000'001);
    for (int i = 0; i < m; i++)
    {
        int t;
        long l, r;
        cin >> t >> l >> r;

        l += c;
        r += c;

        if (t == 1)
        {
            c = st.query(l, r + 1);

            cout << c << '\n';
        }
        else if (t == 2)
            st.update(l, r + 1);
    }
}

int main()
{
    ios_base::sync_with_stdio(false), cin.tie(NULL);

    solve();

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...