分块30分救助
查看原帖
分块30分救助
789721
Xdragon楼主2025/7/25 09:01

3030 分,WA #4104 \sim 10

# include<bits/stdc++.h>
# define int long long
using namespace std;
int a[500005],num[500005],sum[500005];
bitset<500005>f;
signed main()
{
	cin.tie(0)->sync_with_stdio(0);
	int n,m,ans=0,size;
	cin>>n>>m;
	size=sqrt(500000);
	for(int i=1;i<=500000;i++) num[i]=(i-1)/size+1;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		sum[num[i]]++;
		ans+=a[i];
		f[i]=1;
	}
	for(int i=1;i<=m;i++)
	{
		char op;
		cin>>op;
		switch(op){
			case 'C':{
				int x,y;
				cin>>x>>y;
				if(!f[x]) break;
				ans-=y;
				a[x]-=y;
				break;
			}
			case 'I':{
				int x,y;
				cin>>x>>y;
				if(!f[x])
				{
					f[x]=1;
					sum[num[x]]++;
				}
				ans=ans-a[x]+y;
				a[x]=y;
				break;
			}
			case 'D':{
				int x,pos=1;
				cin>>x;
				while(x-sum[pos]>0)
				{
					x-=sum[pos];
					pos++;
				}
				for(int i=(pos-1)*size+1;i<=min(pos*size,n);i++)
				{
					if(f[i]) x--;
					if(!x)
					{
						sum[pos]--;
						f[i]=0;
						ans-=a[i];
						a[i]=0;
						break;
					}
				}
				break;
			}
			case 'Q':{
				cout<<ans<<"\n";
				break;
			}
		}
	}
	return 0;
}
2025/7/25 09:01
加载中...