萌新求助求助求助
查看原帖
萌新求助求助求助
182260
zero2005楼主2020/8/5 20:51
#include<bits/stdc++.h>
using namespace std;
long long q[10000001];
int n,m,l,r,k;
long long s=9999999999999;
struct SEtree
{
	int l,r;
	int sum;
	int mx;
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define sum(x) tree[x].sum
	#define mx(x) tree[x].mx
} tree[5000000];
void build(int p,int l,int r,int s)
{
	l(p)=l;r(p)=r;
	if(l==r)
	{
		sum(p)=q[l];
		mx(p)=q[l];
		return;
	}
	int mid=(l+r)>>1;
	build(p*2,l,mid,s);
	build(p*2+1,mid+1,r,s);
	sum(p)=sum(p*2)+sum(p*2+1);
	mx(p)=max(mx(p*2),mx(p*2+1));
	
}
void change(int p,int l,int r)
{
	if(l(p)==r(p))
	{
		sum(p)=sqrt(sum(p));
		mx(p)=sqrt(mx(p));
		return;
	}
		int mid=(l(p)+r(p))/2;
		if(l<=l(p)&&mx(p*2)>1)
		{
			change (p*2,l,r);
		}
		if(r>=r(p)&&mx(p*2+1)>1)
		{
			change(p*2+1,l,r);
		}
		sum(p)=sum(p*2)+sum(p*2+1);
		mx(p)=max(mx(p*2),mx(p*2)+1);

}
int ask(int p,int l,int r)
{
	if(l<=l(p)&&r(p)<=r)
	{
		return sum(p);
	}
	int mid=(l(p)+r(p))/2;
	int val=0;
	if(l<=mid)
	{
		val+=ask(p*2,l,r);
	}
	if(r>=r(p))
	{
		val+=ask(p*2+1,l,r);
	}
	return val;
}
int main()
{int a,b;
	int ans;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>q[i];
	}
	build(1,1,n,s);
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&k);
		if(k==1)
		{
			cin>>a>>b;
			if(a>b)swap(a,b);
	ans=ask(1,a,b);
	cout<<ans<<'\n';
		}
		if(k==0)
		{
			scanf("%d%d",&l,&r);
			if(l>r)swap(l,r);
			
				change(1,l,r);
			
		}
	}
	return 0;
}

有的位置莫名会变成0

2020/8/5 20:51
加载中...