Submission #1198341

#TimeUsernameProblemLanguageResultExecution timeMemory
1198341Richard_DyinmanGrowing Trees (BOI11_grow)C++20
10 / 100
96 ms4420 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define all(x) x.begin(), x.end()
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template <class T>
using ordered_set =
        tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define file \
  freopen("barnpainting.in", "r", stdin);\
  freopen("barnpainting.out", "w", stdout)

#define OJudge(in,out) \
      freopen(in, "r", stdin);\
      freopen(out, "w", stdout)


#define FIn   \
  cin.tie(0); \
  cout.tie(0); \
  ios_base::sync_with_stdio(false)

const string IN = "input.txt";
const string OUT = "output.txt";
int  tc;
ll n, m, a, b, k;


struct seg_tree{
    vector<ll>tree ;
    vector<int> lazy;
    int size;
    void init(int n){
        size = 1;
        while(size < n)
            size *=2;
        tree.resize(2*size + 5, 0ll);
        lazy.resize(2*size + 5 , 0ll);
    }

    void set(int idx, ll val, int l, int r, int node){
        if(l == r){
            tree[node] = val;
            return;
        }
        int mid = (l + r)/2;
        if(idx <= mid)
            set(idx, val, l , mid, 2*node);
        else
            set(idx, val, mid + 1, r, 2*node + 1);
        tree[node] = max(tree[2*node] , tree[2*node + 1]);
    }


    void set(int idx, ll val){
        set(idx , val, 1, size , 1);
    }

    void push(int l, int r, int node){
        if(r - l){
            lazy[2*node] += lazy[node];
            lazy[2*node + 1] += lazy[node];
        }
        tree[node] += lazy[node];
        lazy[node] = 0;
    }

    void add(int l1, int r1, int l, int r, int node){
        push(l , r, node);
        if(r < l1 || l > r1)
            return;
        if(l >= l1 && r <= r1){
            lazy[node]++;
            push(l , r, node);
            return;
        }
        int mid = (l + r)/2;
        add(l1 , r1, l, mid, node*2);
        add(l1 , r1, mid + 1, r, 2*node + 1);
        tree[node] = max(tree[2*node] , tree[2*node + 1]);
    }
    int get_frst(ll h, int l, int r, int node){
        push(l , r , node);
        if(tree[node] < h)
            return n + 1;
        if(l == r){
            return l;
        }
        int mid = (l + r)/2;
        push(l , mid, 2*node);
        if(tree[2*node] >= h)
            return get_frst(h , l , mid, 2*node);
        return get_frst(h , mid + 1, r, 2*node + 1);
    }

    ll get_val(int idx, int l, int r, int node){
        push(l , r, node);
        if(l == r){
            return tree[node];
        }
        int mid = (l + r)/2;
        if(idx <= mid){
            return get_val(idx , l , mid, node*2);
        }
        return get_val(idx, mid + 1, r, 2*node + 1);
    }
    void add(int l, int r){
        if(r < l)
            return;
        add(l , r, 1 , size , 1);
    }

    void apply(int c, int h){
        int idx = get_frst(h, 1, size , 1);
        int lst_idx = min(1ll*(idx + c - 1) , n);
        ll last = get_val(lst_idx , 1, size, 1);
        int idx2 = get_frst(last , 1 , size , 1);
        int cnt = lst_idx - idx2 + 1;
        add(idx , idx2 - 1);
        idx2 = get_frst(last + 1, 1 , size , 1);
        add(idx2 - cnt , idx2 - 1);
    }

    ll get(ll l, ll r){
        int l1 = get_frst(l , 1 , size, 1);
        int r1 = get_frst(r + 1, 1, size , 1);
        return r1 - l1;
    }
};
int arr[100100];
void solve(){
    cin>>n>>m;
    seg_tree sg;
    sg.init(n);
    for(int i = 1; i <= n; i++){
        cin>>arr[i];
    }
    sort(arr + 1, arr + n + 1);
    for(int i = 1; i <= n; i++){
        sg.set(i , arr[i]);
    }
    while(m--){
        char x;
        cin>>x;
        if(x == 'F'){
            cin>>a>>b;
            sg.apply(a , b);
        }else{
            cin>>a>>b;
            cout<<sg.get(a , b)<<"\n";
        }
    }
}




int main() {
    FIn;
//    file;
// #ifndef ONLINE_JUDGE
//     OJudge(IN.c_str(),OUT.c_str());
// #endif
    bool test = 0;
    if (test)
        cin>>tc;
    else tc = 1;
    for (int i = 1; i<=tc; i++){
        solve();
    }
}
#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...