20pts求调
查看原帖
20pts求调
800499
suzhikz楼主2024/3/8 13:42
#include<bits/stdc++.h>
using namespace std;
int n,q;
char c;
struct node{
	int h,id;
}a[1000005];

int sq,sqq;
int tag[1005],l[1005],r[1005];
int ql,qr,w;
bool cmp(node a,node b){
	return a.h<b.h;
}
int main(){
	cin>>n>>q;
	sq=sqq=sqrt(n);
	if(sq*sq<n)sqq++;
	for(int i=1;i<=n;i++){
		cin>>a[i].h;
		a[i].id=i;
	}
	for(int i=1;i<=sqq;i++){
		l[i]=i*sq-sq+1;
		r[i]=min(n,sq*i);
		sort(a+l[i],a+r[i]+1,cmp);
	}
	while(q--){
		cin>>c;
		cin>>ql>>qr>>w;
		int ll=(ql-1)/sq+1,rr=(qr-1)/sq+1;
		if(c=='A'){
			int ans=0;
			for(int i=l[ll];i<=r[ll];i++){
				if(a[i].id>=ql&&a[i].id<=qr){
					if(a[i].h+tag[ll]>=w)ans++;
				}
			}
			if(ll!=rr){
				for(int i=l[rr];i<=r[rr];i++){
					if(a[i].id>=ql&&a[i].id<=qr){
						if(a[i].h+tag[rr]>=w)ans++;
					}
				}
				for(int i=ll+1;i<rr;i++){
					int el=l[i],er=r[i],mid,ans2=0;
					while(el<=er){
						mid=(el+er)/2;
						if(a[mid].h+tag[mid]>=w){
							ans2=mid;
							er=mid-1;
						}else{
							el=mid+1;
						}
					}
					if(ans2!=0)
					ans+=r[i]-ans2+1;
				}
			}
			cout<<ans<<endl;
		}else{
			for(int i=l[ll];i<=r[ll];i++){
				if(a[i].id>=ql&&a[i].id<=qr){
					a[i].h+=w;
				}
			}
			sort(a+l[ll],a+r[ll]+1,cmp);
			if(ll!=rr){
				for(int i=l[rr];i<=r[rr];i++){
					if(a[i].id>=ql&&a[i].id<=qr){
						a[i].h+=w;
					}
				}
				sort(a+l[rr],a+r[rr]+1,cmp);
				for(int i=ll+1;i<rr;i++){
					tag[i]+=w;
				}
			}
		}
	}
}
2024/3/8 13:42
加载中...