Submission #1355837

#TimeUsernameProblemLanguageResultExecution timeMemory
1355837waygonzGrowing Trees (BOI11_grow)C++20
0 / 100
61 ms1716 KiB
#include <bits/stdc++.h>

using namespace std;

int n, m;

struct FenwickTree {
    int N;
    vector<int> fw;
    void update(int x, int v) {
        while (x <= N) fw[x] += v, x += x & -x;
    }
    void range_update(int l, int r, int v) {
        if (r < l) return;
        update(l, v);
        update(r+1, -v);
    }
    int query(int x) {
        int res = 0;
        while (x > 0) res += fw[x], x -= x & -x;
        return res;
    }
    int low(int x) {
        int l = 1, r = n+1;
        while (l < r) {
            int mid = (l + r) / 2;
            if (query(mid) >= x) r = mid;
            else l = mid + 1;
        }
        return l;
    }
    int high(int x) {
        int l = 0, r = n;
        while (l < r) {
            int mid = (l + r + 1) / 2;
            if (query(mid) <= x) l = mid;
            else r = mid - 1;
        }
        return l;
    }
} T;

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> n >> m;
    T.N = n, T.fw.resize(n+1);
    vector<int> a(n+1);
    for (int i = 1; i <= n; i++) cin >> a[i];
    sort(a.begin() + 1, a.end());
    for (int i = 1; i <= n; i++) T.range_update(i, i, a[i]);
    while (m--) {
        char t; cin >> t;
        if (t == 'F') {
            int c, h;
            cin >> c >> h;
            int l = T.low(h), r = min(n, l + c - 1);
            if (r < l) continue;
            int x = T.query(r), id = T.low(x+1);
            if (id <= n && T.query(id) == x+1) {
                int ll = T.low(x);
                int rr = T.high(x);
                T.range_update(l, ll-1, 1);
                T.range_update(rr - ll + l + 1, rr, 1);
            } else T.range_update(l, r, 1);
        } else {
            int l, r;
            cin >> l >> r;
            int ll = T.low(l), rr = T.high(r);
            cout << max(0, rr - ll + 1) << '\n';
        }
    }
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...