Submission #466380

#TimeUsernameProblemLanguageResultExecution timeMemory
466380jli12345Growing Trees (BOI11_grow)C++14
100 / 100
281 ms11204 KiB
#include <bits/stdc++.h>
using namespace std;

void fastIO(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
}

int N, M;

int arr[100100];

typedef long long ll;

ll stsum[400100], stmin[400100], stmax[400100], addtag[400100];

void pushdown(int node, int l, int mid, int r){
    stsum[node*2] += (mid-l+1)*addtag[node];
    stsum[node*2+1] += (r-mid)*addtag[node];
    stmin[node*2] += addtag[node];
    stmin[node*2+1] += addtag[node];
    stmax[node*2] += addtag[node];
    stmax[node*2+1] += addtag[node];
    addtag[node*2] += addtag[node];
    addtag[node*2+1] += addtag[node];
    addtag[node] = 0;
}

void U(int node, int l, int r, int tl, int tr, ll val){
    if (l > tr || r < tl)
        return;
    if (l >= tl && r <= tr){
        stsum[node] += (r-l+1)*val;
        stmin[node] += val;
        stmax[node] += val;
        addtag[node] += val;
        return;
    }
    int mid = (l+r)/2;
    pushdown(node, l, mid, r);
    U(node*2, l, mid, tl, tr, val);
    U(node*2+1, mid+1, r, tl, tr, val);
    stsum[node] = stsum[node*2]+stsum[node*2+1];
    stmin[node] = min(stmin[node*2], stmin[node*2+1]);
    stmax[node] = max(stmax[node*2], stmax[node*2+1]);
}

ll Qsum(int node, int l, int r, int tl, int tr){
    if (l > tr || r < tl)
        return 0;
    if (l >= tl && r <= tr){
        return stsum[node];
    }
    int mid = (l+r)/2;
    pushdown(node, l, mid, r);
    return Qsum(node*2, l, mid, tl, tr)+Qsum(node*2+1, mid+1, r, tl, tr);
}

ll Qlb(int node, int l, int r, int val){ //last index in the range <= val
    if (l == r){
        return l;
    }
    int mid = (l+r)/2;
    pushdown(node, l, mid, r);
    if (stmin[node*2+1] <= val){
        return Qlb(node*2+1, mid+1, r, val);
    } else {
        return Qlb(node*2, l, mid, val);
    }
}

ll Qrb(int node, int l, int r, int val){ //first index in the range >=
    if (l == r){
        return l;
    }
    int mid = (l+r)/2;
    pushdown(node, l, mid, r);
    if (stmax[node*2] >= val){
        return Qrb(node*2, l, mid, val);
    } else {
        return Qrb(node*2+1, mid+1, r, val);
    }
}

int main(){
    fastIO();
    cin >> N >> M;
    for (int i = 1; i <= N; i++){
        cin >> arr[i];
    }
    sort(arr+1, arr+1+N);
    for (int i = 1; i <= N; i++){
        U(1, 1, N, i, i, arr[i]);
    }
    /*
    cout << "first: ";
    for (int i = 1; i <= N; i++){
        cout << Qsum(1, 1, N, i, i) << " ";
    }
    cout << "\n";*/
    for (int i = 1; i <= M; i++){
        char k; cin >> k;
        if (k == 'F'){
            int c, h; cin >> c >> h;
            if (stmax[1] < h)
                continue;
            int lpos = Qrb(1, 1, N, h);
            if (lpos+c-1 < N){
                int val = Qsum(1, 1, N, lpos+c-1, lpos+c-1);
                int rpos = Qlb(1, 1, N, val);
                int lrpos = Qrb(1, 1, N, val);
                if (lrpos-1 >= lpos)
                    U(1, 1, N, lpos, lrpos-1, 1);
                int used = lrpos-1-lpos+1;
                if (rpos-(c-used)+1 <= rpos)
                    U(1, 1, N, rpos-(c-used)+1, rpos, 1);
            } else {
                U(1, 1, N, lpos, N, 1);
            }
        } else {
            int mn, mx; cin >> mn >> mx;
            if (mx < stmin[1] || mn > stmax[1]){
                cout << 0 << "\n";
                continue;
            }
            int lpos = Qrb(1, 1, N, mn);
            int rpos = Qlb(1, 1, N, mx);
            cout << rpos-lpos+1 << "\n";
        }
        /*
        for (int j = 1; j <= N; j++)
            cout << Qsum(1, 1, N, j, j) << " ";
        cout << "\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...