제출 #860098

#제출 시각아이디문제언어결과실행 시간메모리
860098ZeroCoolGrowing Trees (BOI11_grow)C++14
100 / 100
736 ms10348 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

#define pb push_back
#define mp make_pair
#define mt make_tuple
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()

using ll = long long;
using ld = long double;
 
void solve(int T);
void pre();
 
const int N = 1e5 + 5;
const int M = 405;
const int SQRT = 500;
const int LOG = 20;
const int INF = 1e18;
const int MOD = 1e9+7;
const ld EPS = 1e-9;

void pre(){
	#ifdef ONLINE_JUDGE
    ios::sync_with_stdio(false);
    cin.tie(0);
	#endif
	
}

int32_t main(){
	pre();
	int tt = 1;
	//cin>>tt;
	for(int i = 1;i<=tt;i++){
		cerr<<"Case "<<i<<": "<<endl;
		solve(i);
	}
    return 0;
}

struct SegTree {
    int n;
    vector<int> v;
    vector<ll> tree;
    vector<ll> lazy;
 
    SegTree(vector<int> const &_v) {
        this->v = _v;
        n = v.size();
        tree.resize(4*n+5, 0);
        lazy.resize(4*n+5, 0);
    }
 
    void push(int u, int tl, int tr) {
        if(lazy[u] == 0) return ;
 
        tree[u] += (tr - tl + 1) * lazy[u];
 
        if(tl != tr) {
            lazy[2*u] += lazy[u];
            lazy[2*u+1] += lazy[u];
        }
 
        lazy[u] = 0;
    }
 
    void build(int u, int tl, int tr) {
        if(tl == tr) {
            tree[u] = v[tl];
        } else {
            int tm = (tl + tr) / 2;
            build(2*u, tl, tm);
            build(2*u+1, tm+1, tr);
            tree[u] = tree[2*u] + tree[2*u+1];
        }
    }
 
    void update(int u, int tl, int tr, int l, int r, int val) {
        push(u, tl, tr);
        if(tl > tr || l > tr || tl > r) return ;
 
        if(l <= tl && tr <= r) {
            lazy[u] += val;
            push(u, tl, tr);
            return ;
        }
 
        int tm = (tl + tr) / 2;
        update(2*u, tl, tm, l, r, val);
        update(2*u+1, tm+1, tr, l, r, val);
        tree[u] = tree[2*u] + tree[2*u+1];
    }
 
    ll query(int u, int tl, int tr, int pos) {
        if(tl > tr || tl > pos || pos > tr) return 0;
        push(u, tl, tr);
        if(tl == tr) return tree[u];
        int tm = (tl + tr) / 2;
        if(pos <= tm)
            return query(2*u, tl, tm, pos);
        return query(2*u+1, tm+1, tr, pos);
    }
 
    void update(int l, int r, int val) {
        update(1, 0, n-1, l, r, val);
    }
 
    ll query(int pos) {
        return query(1, 0, n-1, pos);
    }
};

int n;

int binS(int l,int r, function<bool(int)> f){
	int ans = n;
	while(l <= r){
		int mid = (l + r)/ 2;
		if(f(mid)){
			ans = mid;
			r = mid - 1;
		}else{
			l = mid + 1;
		}
	}

	return ans;
}

void solve(int T){
	cin>>n;
	int q;
	cin>>q;
	
	vector<int> A(n);
	for(int i = 0;i<n;i++)cin>>A[i];

	sort(all(A));
	SegTree sgt(A);
	sgt.build(1,0,n-1);

	while(q--){
		char t;
		cin>>t;
		if(t == 'F'){
			int c,h;
			cin>>c>>h;
			int ql = binS(0,n-1,[&](int x){
				return sgt.query(x) >= h;
			});

			int qr = ql + c - 1;
			if(qr >= n-1){
				sgt.update(ql,qr,1);
				continue;
			}
			int nl = binS(ql, n-1, [&](int x){
				return sgt.query(x) >= sgt.query(qr);
			});
			int nr = binS(nl, n-1, [&](int x){
				return sgt.query(x) > sgt.query(qr);
			}) - 1;

			sgt.update(ql, nl - 1, 1);
			sgt.update(nr - c + nl - ql + 1, nr, 1);
		}else{
			int a,b;
			cin>>a>>b;
			if(sgt.query(n-1) < a){
				cout<<0<<endl;
				continue;
			}
			int l = binS(0, n-1, [&](int x) {
                return sgt.query(x) >= a;
            });
 
            int r = binS(0, n-1, [&](int x) {
                return sgt.query(x) > b;
            });

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