답안 #917015

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
917015 2024-01-27T01:08:15 Z Whisper 원숭이와 사과 나무 (IZhO12_apple) C++17
100 / 100
189 ms 97068 KB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using ld = long double;
using T = tuple<ll, ll, ll>;

//#define int long long
#define Base 41
#define sz(a) (int)a.size()
#define FOR(i, a, b) for ( int i = a ; i <= b ; i++ )
#define FORD(i, a, b) for (int i = b; i >= a; i --)
#define REP(i, n) for (int i = 0; i < n; ++i)
#define REPD(i, n) for (int i = n - 1; i >= 0; --i)
#define all(x) x.begin() , x.end()
#define pii pair<int , int>
#define fi first
#define se second
#define Lg(x) 31 - __builtin_clz(x)

#define MASK(i) (1LL << (i))
#define BIT(x, i) (((x) >> (i)) & 1)

constexpr ll LINF = (1ll << 60);
constexpr int INF = 1e9;
constexpr int MAX = 1e5 + 5;
constexpr int Mod = 1e9 + 7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

void setupIO(){
    #define name "Whisper"
    //Phu Trong from Nguyen Tat Thanh High School for gifted student
    srand(time(NULL));
    cin.tie(nullptr)->sync_with_stdio(false); cout.tie(nullptr);
    //freopen(name".inp", "r", stdin);
    //freopen(name".out", "w", stdout);
    cout << fixed << setprecision(10);
}

template <class X, class Y>
    bool minimize(X &x, const Y &y){
        X eps = 1e-9;
        if (x > y + eps) {x = y; return 1;}
        return 0;
    }

template <class X, class Y>
    bool maximize(X &x, const Y &y){
        X eps = 1e-9;
        if (x + eps < y) {x = y; return 1;}
        return 0;
    }
int Q;
struct Node{
    int l, r, val, lzy;
    Node(): l(-1), r(-1), val(0), lzy(0){}
    Node(int _l, int _r, int _val, int _lzy): l(_l), r(_r), val(_val), lzy(_lzy){}
};

struct SparseSegmentTree{
    vector<Node> f;
    int n;
    SparseSegmentTree(): f(MAX * 60), n(1){}

    void pushDown(int id, int l, int r){
        if (!f[id].lzy) return;
        if (f[id].l == -1)
            f[id].l = ++n;
        if (f[id].r == -1)
            f[id].r = ++n;
        int mid = (l + r) >> 1;
        int &res = f[id].lzy;
        f[f[id].l].lzy = res;
        f[f[id].r].lzy = res;
        f[f[id].l].val = (mid - l + 1) * res;
        f[f[id].r].val = (r - mid) * res;
        f[id].lzy = 0;
    }

    void modify(int u, int v, int val, int id = 1, int l = 1, int r = INF){
        if (u > r || v < l) return;
        if (u <= l && v >= r){
            f[id].val = val * (r - l + 1);
            f[id].lzy = val;
            return;
        }
        if (f[id].l == -1)
            f[id].l = ++n;
        if (f[id].r == -1)
            f[id].r = ++n;
        int mid = (l + r) >> 1;
        pushDown(id, l, r);
        modify(u, v, val, f[id].l, l, mid);
        modify(u, v, val, f[id].r, mid + 1, r);
        f[id].val = f[f[id].l].val + f[f[id].r].val;
    }
    int query(int u, int v, int id = 1, int l = 1, int r = INF){
        if (u > r || v < l) return 0;
        if (u <= l && v >= r) return f[id].val;
        if (f[id].l == -1)
            f[id].l = ++n;
        if (f[id].r == -1)
            f[id].r = ++n;
        int mid = (l + r) >> 1;
        pushDown(id, l, r);
        int ql = query(u, v, f[id].l, l, mid);
        int qr = query(u, v, f[id].r, mid + 1, r);
        return ql + qr;
    }
};
void Whisper(){
    cin >> Q;
    int c = 0;
    SparseSegmentTree st;
    for (int i = 1; i <= Q; ++i){
        int cmd, l, r;
        cin >> cmd >> l >> r;
        l += c, r += c;
        if (cmd == 1){
            c = st.query(l, r);
            cout << c << '\n';
        }
        else{
            st.modify(l, r, 1);
        }
    }
}


signed main(){
    setupIO();
    int Test = 1;
//    cin >> Test;
    for ( int i = 1 ; i <= Test ; i++ ){
        Whisper();
        if (i < Test) cout << '\n';
    }
}

# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 94296 KB Output is correct
2 Correct 22 ms 94300 KB Output is correct
3 Correct 23 ms 94300 KB Output is correct
4 Correct 29 ms 94556 KB Output is correct
5 Correct 30 ms 94556 KB Output is correct
6 Correct 29 ms 94552 KB Output is correct
7 Correct 30 ms 94588 KB Output is correct
8 Correct 76 ms 95312 KB Output is correct
9 Correct 144 ms 94548 KB Output is correct
10 Correct 132 ms 96340 KB Output is correct
11 Correct 156 ms 96340 KB Output is correct
12 Correct 160 ms 96568 KB Output is correct
13 Correct 120 ms 96956 KB Output is correct
14 Correct 123 ms 96852 KB Output is correct
15 Correct 156 ms 97040 KB Output is correct
16 Correct 165 ms 96852 KB Output is correct
17 Correct 124 ms 96892 KB Output is correct
18 Correct 140 ms 96852 KB Output is correct
19 Correct 189 ms 97068 KB Output is correct
20 Correct 168 ms 96848 KB Output is correct