分块40ptsWA求调
查看原帖
分块40ptsWA求调
820056
wmrqwqal & su楼主2023/10/29 10:07
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[1000010],sa[1000010],b[1000010],sq,tag[1000010],l[1000010],r[1000010],x,y,z;
char opt;
long long f(long long L,long long R,long long x)
{
	long long ll=L,rr=R,mid;
	if(sa[rr]+tag[b[R]]<x)
		return 0;
	if(sa[ll]+tag[b[L]]>=x)
		return R-L+1;
	while(ll<rr)
	{
		mid=(ll+rr)/2;
		if(sa[mid]+tag[b[mid]]<x)
			ll=mid+1;
		else
			rr=mid;
	}
	return R-mid;
}
void upt(long long id)
{
	for(int i=l[id];i<=r[id];i++)
		sa[i]=a[i];
	sort(sa+l[id],sa+1+r[id]);
}
void add(long long x,long long y,long long z)
{
	if(b[x]==b[y])
	{
		for(int i=x;i<=y;i++)
			a[i]+=z;
		upt(b[x]);
		return ;
	}
	for(int i=x;i<=r[b[x]];i++)
		a[i]+=z;
	upt(b[x]);
	for(int i=l[y];i<=y;i++)
		a[i]+=z;
	upt(b[y]);
	for(int i=b[x]+1;i<=b[y]-1;i++)
		tag[i]+=z;
}
void query(long long x,long long y,long long z)
{
	long long ans=0;
	if(b[x]==b[y])
	{
		for(int i=x;i<=y;i++)
			if(a[i]+tag[b[i]]>=z)
				ans++;
		printf("%lld\n",ans);
		return ;
	}
	for(int i=x;i<=r[b[x]];i++)	
		if(a[i]+tag[b[i]]>=z)
			ans++;
	for(int i=l[b[y]];i<=y;i++)
		if(a[i]+tag[b[i]]>=z)
			ans++;
	for(int i=b[x]+1;i<=b[y]-1;i++)
		ans+=f(l[i],r[i],z);
	printf("%lld\n",ans);
}
#define QwQ return 0;
int main()
{
	cin>>n>>m;
	sq=sqrt(n);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++)
	{
		l[i]=r[i-1]+1;
		r[i]=min(sq*i,n);
		for(int j=l[i];j<=r[i];j++)
			b[j]=i,sa[j]=a[j];
		if(r[i]==n)
			break;
	}
	while(m--)
	{
		cin>>opt;
		scanf("%lld%lld%lld",&x,&y,&z);
		if(opt=='M')
			add(x,y,z);
		else
			query(x,y,z);
	}
	QwQ;
}
2023/10/29 10:07
加载中...