分块0pts求调
查看原帖
分块0pts求调
820056
wmrqwqal & su楼主2023/10/28 20:17
#include<bits/stdc++.h>
using namespace std;
long long n,m,sq,opt,x,y,a[100010],b[100010],pd[100010],l[100010],r[100010],sum[100010],fl;
void add(long long x,long long y)
{
	for(int i=x;i<=r[b[x]];i++)
	{
		if(pd[b[i]])
		{
			i=r[b[i]];
			continue;
		}
		sum[b[i]]-=a[i]-sqrt(a[i]);
		a[i]=sqrt(a[i]);		
	}
	for(int i=l[b[y]];i<=y;i++)
	{
		if(pd[b[i]])
		{
			i=r[b[i]];
			continue;
		}
		sum[b[i]]-=a[i]-sqrt(a[i]);
		a[i]=sqrt(a[i]);		
	}
	for(int i=r[b[x]]+1;i<=l[b[y]]-1;i++)
	{
		if(pd[b[i]])
		{
			i=r[b[i]];
			continue;
		}
		if(i==l[b[i]])
			fl=0;
		if(i==r[b[i]] && !fl)
			pd[b[i]]=1;
		if(a[i]>1)
		{
			sum[b[i]]-=a[i]-sqrt(a[i]);
			a[i]=sqrt(a[i]);
			fl=1;
		}
	}
}
void query(long long x,long long y)
{
	long long ans=0;
	for(int i=x;i<=r[b[x]];i++)
		ans+=a[i];
	for(int i=l[b[y]];i<=y;i++)
		ans+=a[i];
	for(int i=b[x]+1;i<=b[y]-1;i++)
		ans+=sum[i];
	cout<<ans<<endl;
}
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define QwQ return 0;
int main()
{
	IOS;
	cin>>n;
	sq=sqrt(n);
	for(int i=1;i<=n;i++)
		cin>>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,sum[i]+=a[j];
	}
	cin>>m;
	while(m--)
	{
		cin>>opt>>x>>y;
		if(x>y)
			swap(x,y);
		if(opt==0)
			add(x,y);
		else
			query(x,y);
	}
	QwQ;
}
2023/10/28 20:17
加载中...