蒟蒻求助!!!大佬们帮忙看看吧 WA 20pts
查看原帖
蒟蒻求助!!!大佬们帮忙看看吧 WA 20pts
400593
wuyiduo楼主2022/4/25 21:35
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
const int sN=1020;
int n,q,wx[N],yx[N],add[sN],size,ll,rr,cc;
char opt;
int cal(int x){
	return (x-1)/size+1;
}
void qs(int x){
	for(int i=(x-1)*size+1;i<=min(x*size,n);i++) yx[i]=wx[i];
	sort(yx+(x-1)*size+1,yx+min(x*size,n)+1);
}
void modify(int a,int b,int w){
	int l=cal(a),r=cal(b);
	if(l==r){
		for(int i=a;i<=b;i++) wx[i]+=w;
		qs(l);
	}
	else{
		for(int i=a;i<=l*size;i++) wx[i]+=w;
		qs(l);
		for(int i=l+1;i<r;i++) add[i]+=w;
		for(int i=(r-1)*size+1;i<=b;i++) wx[i]+=w;
		qs(r);
	}
}
int query(int a,int b,int c){
	int ans=0;
	int l=cal(a),r=cal(b);
	if(l==r){
		for(int i=a;i<=b;i++)
			if(wx[i]+add[l]>=c) ans++;
	}
	else{
		for(int i=a;i<=l*size;i++)
			if(wx[i]+add[l]>=c) ans++;
		for(int i=l+1;i<r;i++){
			int del=lower_bound(yx+(i-1)*size+1,yx+i*size+1,c-add[l])-&yx[(i-1)*size]-1;
			ans+=size-del;
		}
		for(int i=(r-1)*size+1;i<=b;i++)
			if(wx[i]+add[r]>=c) ans++;
	}
	return ans;
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++) scanf("%d",&wx[i]);
	size=sqrt(n);
	int sum=n/size+1;
	if(n%size==0) sum--;
	for(int i=1;i<=sum;i++) qs(i);
	while(q--){
		cin>>opt;
		scanf("%d%d%d",&ll,&rr,&cc);
		if(opt=='M') modify(ll,rr,cc);
		else printf("%d\n",query(ll,rr,cc));
	}
	return 0;
}
2022/4/25 21:35
加载中...