제출 #669990

#제출 시각아이디문제언어결과실행 시간메모리
669990gortomi원숭이와 사과 나무 (IZhO12_apple)C++17
100 / 100
39 ms3072 KiB
#include <bits/stdc++.h>
using namespace std;
struct node
{
    int l, r, sum;
    bool lazy;
    node* lc;
    node* rc;
    node(int il, int ir)
    {
        l = il;
        r = ir;
        lazy = 0;
        sum = 0;
        lc = nullptr;
        rc = nullptr;
    }
    void next()
    {
        if(lc != nullptr) return;
        int m = (l + r) / 2;
        lc = new node(l, m);
        rc = new node(m + 1, r);
    }
    int val(int ql, int qr)
    {
        if(ql > qr) return 0;
        if(ql == l && qr == r)
        {
            return sum;
        }
        if(lazy) return qr - ql + 1;
        next();
        int m = (l + r) / 2;
        return lc -> val(ql, min(m, qr)) + rc -> val(max(ql, m  + 1), qr);
    }
    void upd(int ul, int ur)
    {
        if(ul > ur) return;
        if(ul == l && ur == r)
        {
            lazy = 1;
            sum = r - l + 1;
            return;
        }
        if(lazy) return;
        next();
        int m = (l + r) / 2;
        lc -> upd(ul, min(m, ur));
        rc -> upd(max(ul, m  + 1), ur);
        sum = lc -> sum + rc -> sum;
    }
};
node root = node(1, 1e9);
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int m, type, il, ir, c = 0;
    cin >> m;
    while(m--)
    {
        cin >> type >> il >> ir;
        if(type == 1)
        {
            c = root.val(il + c, ir + c);
            cout << c << "\n";
        }
        if(type == 2) root.upd(il + c, ir + c);
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...