Submission #96943

#TimeUsernameProblemLanguageResultExecution timeMemory
96943dalgerokGrowing Trees (BOI11_grow)C++14
100 / 100
259 ms7624 KiB
#include<bits/stdc++.h>
using namespace std;


const int N = 1e5 + 5;




int n, m, a[N];


struct item{
    item *l, *r;
    int key, prior, mx, ob, cnt;
    item(){}
    item(int x){
        key = mx = x;
        ob = 0;
        cnt = 1;
        prior = (rand() ^ (rand() << 15));
        l = r = nullptr;
    }
};
typedef item *pitem;
pitem t;

inline int cnt(pitem v){
    return v ? v->cnt : 0;
}
inline int mx(pitem v){
    return v ? v->mx : 0;
}
inline void upd_cnt(pitem v){
    if(v){
        v->cnt = cnt(v->l) + 1 + cnt(v->r);
        v->mx = max({mx(v->l), v->key, mx(v->r)});
    }
}
inline void Push(pitem v){
    if(v && v->ob){
        if(v->l){
            v->l->ob += v->ob;
        }
        if(v->r){
            v->r->ob += v->ob;
        }
        v->key += v->ob;
        v->ob = 0;
    }
}
void Merge(pitem &v, pitem l, pitem r){
    Push(l);
    Push(r);
    if(!l || !r){
        v = l ? l : r;
        return;
    }
    if(l->prior > r->prior){
        Merge(l->r, l->r, r);
        v = l;
    }
    else{
        Merge(r->l, l, r->l);
        v = r;
    }
    upd_cnt(v);
}
void Split(pitem v, int key, pitem &l, pitem &r){
    Push(v);
    if(!v){
        l = r = nullptr;
        return;
    }
    if(key < v->key){
        Split(v->l, key, l, v->l);
        r = v;
    }
    else{
        Split(v->r, key, v->r, r);
        l = v;
    }
    upd_cnt(v);
}
void Split_cnt(pitem v, int key, pitem &l, pitem &r, int add = 0){
    Push(v);
    if(!v){
        l = r = nullptr;
        return;
    }
    int cur_key = cnt(v->l) + add;
    if(key <= cur_key){
        Split_cnt(v->l, key, l, v->l, add);
        r = v;
    }
    else{
        Split_cnt(v->r, key, v->r, r, add + 1 + cnt(v->l));
        l = v;
    }
    upd_cnt(v);
}


int main(){
    srand(time(nullptr));
    ios_base::sync_with_stdio(0);cin.tie(0);cout.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++){
        Merge(t, t, new item(a[i]));
    }
    while(m--){
        char type;
        cin >> type;
        if(type == 'F'){
            int c, h;
            cin >> c >> h;
            pitem tl, tr;
            Split(t, h - 1, tl, t);
            Split_cnt(t, min(cnt(t), c), t, tr);
            int val = mx(t);
            pitem tll, trr;
            Split(t, val - 1, tll, trr);
            if(tll){
                tll->ob += 1;
            }
            if(trr){
                trr->ob += 1;
            }
            pitem tlll, trrr;
            Split(tr, val, tlll, trrr);
            Merge(t, tl, tll);
            Merge(t, t, tlll);
            Merge(t, t, trr);
            Merge(t, t, trrr);
        }
        else{
            int l, r;
            cin >> l >> r;
            pitem tl, tr;
            Split(t, r, t, tr);
            Split(t, l - 1, tl, t);
            cout << cnt(t) << "\n";
            Merge(t, tl, t);
            Merge(t, t, tr);
        }
    }
}
#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...