제출 #1256875

#제출 시각아이디문제언어결과실행 시간메모리
1256875keremGrowing Trees (BOI11_grow)C++20
0 / 100
72 ms7748 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fr first
#define sc second
#define pb push_back
#define all(x) x.begin(),x.end()
#define sp << " " <<
#define inf 1e15
#define N 100000
 
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef tuple<int,int,int> tiii;
typedef pair<int,int> pii;


int n,q,a[N+5],st[4*N],lz[8*N];

void init(int x=1,int l=1,int r=n){
	if(l==r){
		st[x]=a[l];
		return;
	}
	int mid=(l+r)/2;
	init(2*x,l,mid);
	init(2*x+1,mid+1,r);
	st[x]=st[2*x+1];
}
void push(int x){
	if(lz[x]){
		st[x]+=lz[x];
		lz[2*x]+=lz[x];
		lz[2*x+1]+=lz[x];
		lz[x]=0;
	} 
}
int upperbound(int k,int x=1,int l=1,int r=n){
	if(k>=st[x]) return r+1;
	if(l==r) return l;
	push(2*x);
	int mid=(l+r)/2;
	if(st[2*x]<=k) return upperbound(k,2*x+1,mid+1,r);
	else return upperbound(k,2*x,l,mid);
}
void update(int ql,int qr,int x=1,int l=1,int r=n){
	push(x);
	if(r<ql || qr<l) return;
	if(ql<=l && r<=qr){
		lz[x]+=1;
		push(x);
		return;
	}
	int mid=(l+r)/2;
	update(ql,qr,2*x,l,mid);
	update(ql,qr,2*x+1,mid+1,r);
	st[x]=st[2*x+1];
}
int query(int k,int x=1,int l=1,int r=n){
	if(r<k || k<l) return 0;
	push(x);
	if(l==r)
		return st[x];
	int mid=(l+r)/2;
	return query(k,2*x,l,mid)+query(k,2*x+1,mid+1,r);
}
void solve(){
	cin >> n >> q;
	for(int i=1;i<=n;i++)
		cin >> a[i];
	sort(a+1,a+n+1);
	init();
	while(q--){
		char c;
		cin >> c;
		if(c=='F'){
			int t,x;
			cin >> t >> x;
			int l=upperbound(x-1);
			if(l<=n){
				if(l+t-1>n)
					update(l,n);
				else{
					int k=query(l+t-1);
					int r=upperbound(k-1)-1;
					update(l,r);
					t-=r-l+1;
					r=upperbound(k)-1;
					l=r-t+1;
					update(l,r);
				}
			}
		}
		if(c=='C'){
			int x,y;
			cin >> x >> y;
			cout << upperbound(y)-upperbound(x-1) << "\n";
		}
	}
}
int32_t main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);cout.tie(NULL);
	
	int test=1;
	//~ cin >> test;
	while(test--) 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...