제출 #1348147

#제출 시각아이디문제언어결과실행 시간메모리
1348147primovocatusGrowing Trees (BOI11_grow)C++20
0 / 100
9 ms2108 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 5;
const int inf = 2e9;

int a[N];

struct {
    int t[4 * N], lazy[4 * N];

    void build(int v, int tl, int tr) {
        if (tl == tr) {
            t[v] = a[tl];
            return;
        }

        int tm = (tl + tr) >> 1;

        build(v << 1, tl, tm);
        build(v << 1 | 1, tm + 1, tr);

        t[v] = max(t[v << 1], t[v << 1 | 1]);
    }
    void push(int v) {
        if (!lazy[v]) return;
        int x = lazy[v];

        t[v << 1] += x;
        t[v << 1 | 1] += x;

        lazy[v << 1] += x;
        lazy[v << 1 | 1] += x;

        lazy[v] = 0;
    }
    int in(int v, int tl, int tr, int l) {
        if (tl == tr) {
            return t[v];
        }

        int tm = (tl + tr) >> 1;

        push(v);
        if (l <= tm) {
            return in(v << 1, tl, tm, l);
        } else {
            return in(v << 1 | 1, tm + 1, tr, l);
        }
    }
    void update(int v, int tl, int tr, int l, int r) {
        if (l > r) return;

        if (tl == l && tr == r) {
            ++t[v], ++lazy[v];
            return;
        }

        int tm = (tl + tr) >> 1;

        push(v);
        update(v << 1, tl, tm, l, min(tm, r));
        update(v << 1 | 1, tm + 1, tr, max(tm + 1, l), r);

        t[v] = max(t[v << 1], t[v << 1 | 1]);
    }
    pair<int, int> get(int v, int tl, int tr, int x) {
        if (tl == tr) {
            return {tl, t[v]};
        }

        int tm = (tl + tr) >> 1;

        push(v);
        if (t[v << 1] > x) {
            return get(v << 1, tl, tm, x);
        } else {
            return get(v << 1 | 1, tm + 1, tr, x);
        }
    }
} T;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr);
    
    int n, q;
    cin >> n >> q;
    
    a[n + 1] = inf;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
    }

    sort(a + 1, a + n + 1);

    T.build(1, 1, n + 1);
    for (int i = 0; i < q; ++i) {
        char t; int l, r;
        cin >> t >> l >> r;

        if (t == 'F') {
            pair<int, int> gl = T.get(1, 1, n + 1, r - 1);
            int ql = gl.first, qr = ql + l - 1;
            
            if (qr > n) {
                T.update(1, 1, n + 1, ql, qr);
            } else {
                int val = T.in(1, 1, n + 1, qr);
                int tl = T.get(1, 1, n + 1, val - 1).first;
                int tr = T.get(1, 1, n + 1, val).first - 1;

                int st = l;
                if (ql <= tl - 1) {
                    st -= ql - tl + 2;
                    T.update(1, 1, n + 1, ql, tl - 1);
                }
                
                if (st) {
                    tl = tr - st + 1; 
                    T.update(1, 1, n + 1, tl, tr);
                }
            }
        } else {
            cout << T.get(1, 1, n + 1, r).first - T.get(1, 1, n + 1, l - 1).first << "\n";
        }
    }

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