Submission #1293648

#TimeUsernameProblemLanguageResultExecution timeMemory
1293648Hamed_GhaffariGrowing Trees (BOI11_grow)C++20
100 / 100
96 ms4248 KiB
#include <bits/stdc++.h>
using namespace std;

#define lc id<<1
#define rc lc|1
#define mid ((l+r)>>1)

const int MXN = 1e5+5;

int n, mn[MXN<<2], mx[MXN<<2], lz[MXN<<2];
inline void apply(int x, int id) {
    mn[id] += x;
    mx[id] += x;
    lz[id] += x;
}
inline void push(int id) {
    if(!lz[id]) return;
    apply(lz[id], lc);
    apply(lz[id], rc);
    lz[id] = 0;
}
void upd(int s, int e, int x, int l=1, int r=n+1, int id=1) {
    if(s>=r || l>=e) return;
    if(s<=l && r<=e) return apply(x, id);
    push(id);
    upd(s, e, x, l, mid, lc);
    upd(s, e, x, mid, r, rc);
    mn[id] = mn[lc];
    mx[id] = mx[rc];
}
int get(int x, int l=1, int r=n+1, int id=1) {
    if(r-l == 1) return mn[id];
    push(id);
    return x<mid ? get(x, l, mid, lc) : get(x, mid, r, rc);
}
int find(int x, int l=1, int r=n+1, int id=1) {
    if(mn[id]>x) return 0;
    if(mx[id]<=x) return r-l;
    push(id);
    return find(x, l, mid, lc) + find(x, mid, r, rc);
}

int q, a[MXN];

int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    cin >> n >> q;
    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, i+1, a[i]);
    while(q--) {
        char t;
        cin >> t;
        if(t=='F') {
            int c, h;
            cin >> c >> h;
            int L = find(h-1)+1, R = L+c-1;
            if(R>=n) {
                upd(L, n+1, 1);
                continue;
            }
            int val = get(R);
            int pos = find(val);
            if(pos==R) {
                upd(L, R+1, 1);
                continue;
            }
            int pos2 = max(find(val-1), L-1);
            upd(pos-c+(pos2+1-L)+1, pos+1, 1);
            upd(L, pos2+1, 1);
        }
        else {
            int l, r;
            cin >> l >> r;
            cout << find(r) - find(l-1) << '\n';
        }
    }
}
#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...