UNKNOWN ERROR?
查看原帖
UNKNOWN ERROR?
72862
ULGANO楼主2022/10/18 20:19
#include<bits/stdc++.h>//如果一个区间的最大值为1,我们就可以直接跳过这段区间的修改。只有最大值大于1时才有修改的必要。
//因为不涉及+ ×不用传递懒标记所以不用写pushdown 
using namespace std;
#define int long long
int n,m,a[100005];
int cnt=0;
struct tree{
	int l,r,sum,maxn;
}tr[1000005*4];
inline void pushup(int p)
{
	tr[p].sum=tr[p<<1].sum+tr[p<<1|1].sum;
	tr[p].maxn=max(tr[p<<1].maxn,tr[p<<1|1].maxn);
}
inline void build(int p,int l,int r)
{
	if(l==r)
	{
		tr[p]={l,r,a[l],a[l]};
		return ;
	}
	tr[p]={l,r,0,0};
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
}
inline void modify(int p,int l,int r)
{
	if(tr[p].l==tr[p].r)
	{
		tr[p].sum=sqrt(tr[p].sum);
		tr[p].maxn=sqrt(tr[p].maxn);
		return ;
	}
	int mid=(tr[p].l+tr[p].r)>>1;
	if(l<=mid&&tr[p<<1].maxn>1)//只要在[l,r]中还有包含 
		modify(p<<1,l,r);
	if(r>mid&&tr[p<<1|1].maxn>1)
		modify(p<<1|1,l,r);
	pushup(p); 
}
inline int query(int p,int l,int r)
{
	if(tr[p].l==tr[p].r)
	{
		return tr[p].sum;
	}
	int sum=0;
	int mid=(tr[p].l+tr[p].r)>>1;
	if(l<=mid)sum+=query(p<<1,l,r);
	if(r>mid)sum+=query(p<<1|1,l,r);
	return sum;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	while(cin>>n)
	{ 
		cnt++;
		int flag=1;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
		}
		build(1,1,n);
		cin>>m;
		for(int i=1;i<=m;i++)
		{
			int k,l,r;
			cin>>k>>l>>r;
			if(l>r)swap(l,r);
			if(k==1)
			{
				if(flag)
				{
					cout<<"Case #"<<cnt<<":"<<endl;
					flag=0;
				}
				cout<<query(1,l,r)<<endl;
			}
			if(k==0)
			{
				modify(1,l,r);
			}
		}
	cout<<"\n";
	}
	return 0;
}
2022/10/18 20:19
加载中...