珂爱分块在线求调,玄关
  • 板块P4879 ycz的妹子
  • 楼主qzmoot
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/8 20:05
  • 上次更新2024/6/8 22:00:34
查看原帖
珂爱分块在线求调,玄关
774854
qzmoot楼主2024/6/8 20:05
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+4105,SN=710;
int n,m;
int a[N],book[N];
int len,l[SN+5],r[SN+5],id[N+5],sum[SN+5],cnt[SN+5];
int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
char op[2],x,y;
void upd1(int pos,int val)
{
	if(!book[pos])
		book[pos]=1,cnt[id[pos]]++;
	int cha=val-a[pos];
	a[pos]=val;
	sum[id[pos]]+=cha;
}
void upd2(int kth)
{
	int now=1;
	while(kth)
	{
		if(kth-cnt[now]<=0)
		{
			cnt[now]--;
			for(int i=l[now];i<=r[now];i++)
			{
				kth-=book[i];
				if(!kth)
				{
					book[i]=0;
					sum[now]-=a[i];
					a[i]=0;
					return;
				}
			}
			break;
		}
		kth-=cnt[now];
		now++;
		if(now>SN)
			break;
	}
}
int query()
{
	int res=0;
	for(int i=1;i<=SN;i++)
		res+=sum[i];
	return res;
}
signed main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)
		a[i]=read(),book[i]=1;
	for(int i=1;i<=SN;i++)
	{
		l[i]=(i-1)*SN+1,r[i]=i*SN;
		for(int j=l[i];j<=r[i];j++)
			sum[i]+=a[j],id[j]=i,cnt[i]+=book[i];
	}
	while(m--)
	{
		scanf("%s",op);
		if(op[0]=='C')
		{
			x=read(),y=read();
			upd1(x,a[x]-y);
		}
		else if(op[0]=='I')
		{
			x=read(),y=read();
			upd1(x,y);
		}
		else if(op[0]=='D')
		{
			x=read();
			upd2(x);
		}
		else
			printf("%lld\n",query());
	}
	return 0;
}
2024/6/8 20:05
加载中...