Submission #1275059

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

#define all(v) v.begin(),v.end()

typedef vector<int> vi; 

struct SegTree{
    int n; 
    vi tree,lazy;
    SegTree(int n) : n(n){
        tree.assign(4 * n + 100,0);
        lazy.assign(4 * n + 100,0); 
    }

    void build(int node,int s,int e,vi &a){
        if (s > e) return;
        if (s == e){
            tree[node] = a[s]; 
            return; 
        }
        int m = (s+e) / 2;
        build(node*2,s,m, a);
        build(node*2+1,m+1,e, a); 
    }

    void push(int node,int s,int e){
        if (lazy[node] == 0) return;
        if (s == e) tree[node] += lazy[node]; 
        else {
            lazy[node*2] += lazy[node];
            lazy[node*2+1] += lazy[node]; 
        }
        lazy[node] = 0; 
    }

    int query(int node,int s,int e,int idx){
        push(node,s,e); 
        if (s == e && s == idx) return tree[node]; 
        int m = (s+e) / 2;
        if (idx <= m) return query(node*2,s,m,idx);
        else return query(node*2+1,m+1,e,idx); 
    }
    
    void update(int node,int s,int e,int l,int r){
        push(node,s,e); 
        if (s > e || r < s || e < l) return; 
        if (l <= s && e <= r){
            lazy[node]++;
            push(node,s,e);    
            return; 
        }
        int m = (s+e) / 2;
        update(node*2,s,m,l,r);
        update(node*2+1,m+1,e,l,r); 
    }
    
    
    int find(int val){
        int s = 0,e = n-1,ans = n;
        while (s <= e){
            int m = (s+e) / 2,q = query(1,0,n-1,m); 
            if (val <= q){
                ans = m;
                e = m-1;
            }
            else s = m+1; 
        }
        return ans; 
    }

    int query(int idx) {return query(1,0,n-1,idx);}
    void update(int l,int r){update(1,0,n-1,l,r);} 
};

int n,m;
vi a; 

int32_t main(){
    ios_base::sync_with_stdio(NULL); cin.tie(NULL); cout.tie(NULL); 
    cin >> n >> m;
    a.assign(n,0);
    for (int i = 0; i < n; i++) cin >> a[i]; 
    sort(all(a)); 

    SegTree tree(n); 
    tree.build(1,0,n-1,a); 

    for (int i = 0; i < m; i++){
        char t; int q1,q2; cin >> t >> q1 >> q2;
        if (t == 'F'){
            int l = tree.find(q2);
            if (l == n) continue;
            int r = min(n-1,l + q1 - 1); 
            int startoflast = tree.find(tree.query(r)); 
            int endoflast = tree.find(tree.query(r) + 1) - 1; 
            if (l < startoflast) tree.update(l,startoflast-1); 
            int siz = r - startoflast + 1; 
            tree.update(endoflast - siz + 1,endoflast);
        }
        else {
            int l = tree.find(q1);
            int r = tree.find(q2+1); 
            cout << r - l << endl; 
        }
    }


}
#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...