分块70pts求调
查看原帖
分块70pts求调
1115392
small_moon楼主2024/9/5 21:06
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
typedef long long ll;
ll read();
ll n,q,m;
ll bar[N],a[N],p[N];
void init()
{
	ll num=n/m; if(n%m) num++;
	for(int i=1;i<=num;i++)
		for(int j=1;j<=m;j++)
		{
			ll k=j+(i-1)*m;
			p[k]=i,bar[i]+=a[k];
		}
}
ll qurey(ll l,ll r)
{
	ll ret=0;
	if(p[l]==p[r])
	{
		for(int i=l;i<=r;i++) ret+=a[i];
		return ret;
	}
	for(int i=p[l]+1;i<=p[r]-1;i++) ret+=bar[i];
	for(int i=l;p[i]==p[l];i++) ret+=a[i];
	for(int i=r;p[i]==p[r];i--) ret+=a[i];
	return ret;
}
int main()
{
	n=read(); q=read(); m=sqrt(n);
	for(int i=1;i<=n;i++) a[i]=read();
	init();
	while(q--)
	{
		ll opt=read(),x=read(),y=read();
		if(opt==1) a[x]+=y,bar[p[x]]+=y;
		else printf("%lld\n",qurey(x,y));
	}
	return 0;
}
ll read()
{
	ll x=0,f=1; char ch=getchar();
	while(ch<'0' || ch>'9')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}

记录

(验证码bbbg祭)

2024/9/5 21:06
加载中...