Submission #1213446

#TimeUsernameProblemLanguageResultExecution timeMemory
1213446orzorzorzGrowing Trees (BOI11_grow)C++20
Compilation error
0 ms0 KiB
#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define ff first
#define ss second
#define all(x) x.begin(), x.end()

const int mxN=1e5+1;

ll bit[mxN+1], a[mxN+1];
int n, m;

void upd(int pos, ll val) {
    for(; pos<=mxN; pos+=pos&-pos) {
        bit[pos]+=val;
    }
}

ll qry(int pos) {
    ll res=0;
    for(; pos; pos-=pos&-pos) {
        res+=bit[pos];
    }
    return res;
}

int firstTrue(int lo, int hi, function<bool(int)> pred) {
    while (lo < hi) {
        int mid = lo + (hi - lo) / 2;
        if (pred(mid)) hi = mid;
        else lo = mid + 1;
    }
    return lo;
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    cin>>n>>m;
    for(int i=1; i<=n; i++) {
        cin>>a[i];
    }   
    sort(a+1, a+n+1); 
    for(int i=1; i<=n; i++) {
        upd(i, a[i]);
        upd(i+1, -a[i]);
    }
    for(int i=0; i<m; i++) {
        char ty; cin>>ty;
        if (ty == 'F') {
            int c, h; cin >> c >> h;
            int left = f(h);
            if (left == n + 1) continue;
            int right = left + c - 1;
            if (right > n) {
                upd(left, 1);
                upd(n + 1, -1);
            } else {
                ll val = qry(right);
                // If no duplicates, update [left, right]
                if (qry(right) != qry(right + 1)) {
                    upd(left, 1);
                    upd(right + 1, -1);
                } else {
                    // Find range of duplicates
                    int l_ = firstTrue(left, n, [&](int i) { return qry(i) >= val; });
                    int r_ = firstTrue(l_, n, [&](int i) { return qry(i) > val; }) - 1;
                    int to_update = c;
                    // Update trees before duplicates
                    if (l_ > left) {
                        int count = min(to_update, l_ - left);
                        upd(left, 1);
                        upd(left + count, -1);
                        to_update -= count;
                    }
                    // Update suffix of duplicates if needed
                    if (to_update > 0) {
                        int start = max(l_, r_ - to_update + 1);
                        if (start <= r_) {
                            upd(start, 1);
                            upd(r_ + 1, -1);
                        }
                    }
                }
            }
        }
    }
    return 0;
}
//rating below 2400 must be solved orzorzorz

Compilation message (stderr)

grow.cpp: In function 'int main()':
grow.cpp:52:24: error: 'f' was not declared in this scope
   52 |             int left = f(h);
      |                        ^