蒟蒻刚学分块50分求调
查看原帖
蒟蒻刚学分块50分求调
767259
CYHstudy楼主2024/8/10 17:46
#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int N=1e5+10,M=505;
ll n,m,T,B,arr[N],sum[M],L[M],R[M],pos[N];
bool fl[M];

inline void cha(ll le,ll ri)
{
	ll p=pos[le],q=pos[ri];
	if(p==q&&fl[p])
	{
		for(int i=le;i<=ri;i++)
		{
			sum[p]-=arr[i];
			arr[i]=sqrt(arr[i]);
			sum[p]+=arr[i];
		}
		if(sum[p]==(R[p]-L[p]+1)) fl[p]=true;
	}
	else
	{
		for(int i=p+1;i<=q-1;i++)
		{
			if(fl[i]) continue;
			for(int j=L[i];j<=R[i];j++) 
			{
				sum[i]-=arr[j];
				arr[j]=sqrt(arr[j]);
				sum[i]+=arr[j];
			}
			if(sum[i]==(R[i]-L[i]+1)) fl[i]=1;
		}
		if(!fl[p])
		{
			for(int i=le;i<=R[p];i++)
		    {
			    sum[p]-=arr[i];
			    arr[i]=sqrt(arr[i]);
			    sum[p]+=arr[i];
		    }
		}
    	if(!fl[q])
		{
			for(int i=L[q];i<=ri;i++)
		    {
		    	sum[q]-=arr[i];
			    arr[i]=sqrt(arr[i]);
			    sum[q]+=arr[i];
		    }
		}
	}
	if(sum[p]==(R[p]-L[p]+1)) fl[p]=1;
	if(sum[q]==(R[q]-L[q]+1)) fl[q]=1;
}

inline ll ask(ll le,ll ri)
{
	ll p=pos[le],q=pos[ri],ans=0;
	if(p==q)
	{
		for(int i=le;i<=ri;i++) ans+=arr[i];
	}
	else
	{
		for(int i=p+1;i<=q-1;i++) ans+=sum[i];
		for(int i=le;i<=R[p];i++) ans+=arr[i];
		for(int i=L[q];i<=ri;i++) ans+=arr[i];
	}
	return ans;
}

int main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&arr[i]);
	scanf("%lld",&m);
	T=max(1ll,(ll)sqrt(n));B=max(1ll,n/T);
	for(int i=1;i<=T;i++)
	{
		L[i]=(i-1)*B+1;
		R[i]=i*B;
	}
	if(R[T]<n)
	{
		T++;
		L[T]=R[T-1]+1;
		R[T]=n;
	}
	for(int i=1;i<=T;i++)
	{
		for(int j=L[i];j<=R[i];j++) 
		{
			sum[i]+=arr[j];
			pos[j]=i;
		}
	}
	while(m--)
	{
		ll opt,l,r;
		scanf("%lld%lld%lld",&opt,&l,&r);
		if(l>r) swap(l,r);
		if(!opt) cha(l,r);
		else printf("%lld\n",ask(l,r));
	}
	return 0;
} 
2024/8/10 17:46
加载中...