40pts
查看原帖
40pts
648756
Shadow_Lord楼主2023/3/16 18:39
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
inline int read()
{
	int s=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
	return s*w;
}
int n,a[N],b[N],l[N],r[N],belong[N],block,num,q,add[N];
char xx;
void build()
{
	block=int(sqrt(n));
	num=n/block;
	if(n%block) num++;
	for(int i=1;i<num;i++)
	{
		l[i]=(i-1)*block+1;
		r[i]=i*block;
		sort(b+l[i],b+r[i]+1);
	}
	l[num]=(num-1)*block+1;
	r[num]=n;
	sort(b+l[num],b+r[num]+1);
	for(int i=1;i<=n;i++)
	{
		belong[i]=(i-1)/block+1;
	}
}
void reset(int x)
{
	for(int i=l[x];i<=r[x];i++) b[i]=a[i];
	sort(b+l[x],b+r[x]+1);
}
void update(int left,int right,int v)
{
	if(belong[left]==belong[right])
	{
		for(int i=left;i<=right;i++)a[i]+=v;
		reset(belong[left]);
		return ;
	}
	for(int i=left;i<=r[belong[left]];i++)a[i]+=v;
	reset(belong[left]);
	for(int i=belong[left]+1;i<belong[right];i++)add[i]+=v;
	for(int i=l[belong[right]];i<=right;i++)a[i]+=v;
	reset(belong[right]);
}
int fin(int x,int v)
{
	int left=l[x],right=r[x];
	if(a[r[x]]<v)return 0;
	while(left<right)
	{
		int mid=(left+right)>>1;
		if(a[mid]>=v)
		{
			right=mid;
		}
		else left=mid+1;
	}
	right=(right+left)>>1;
	return r[x]-right+1;
}
int ask(int left,int right,int v)
{
	int sum=0;
	if(belong[left]==belong[right])
	{
		for(int i=left;i<=right;i++)
		{
			if(a[i]+add[belong[i]]>=v)sum++;
		}
		return sum;
	}
	for(int i=left;i<=r[belong[left]];i++)if(a[i]+add[belong[i]]>=v)sum++;
	for(int i=belong[left]+1;i<belong[right];i++)sum+=fin(i,v-add[i]);
	for(int i=l[belong[right]];i<=right;i++)if(a[i]+add[belong[i]]>=v)sum++;
	return sum;
}
int main()
{
	n=read();q=read();
	for(int i=1;i<=n;i++)a[i]=read();
	build();
	while(q--)
	{
		cin>>xx;
		if(xx=='M')
		{
			update(read(),read(),read());
		}
		else printf("%d\n",ask(read(),read(),read()));
	}
	return 0;
}
2023/3/16 18:39
加载中...