线段树WA50pts求调,换了l,r,开了longlnog
查看原帖
线段树WA50pts求调,换了l,r,开了longlnog
291509
Cupricion楼主2024/7/31 15:55
#include<bits/stdc++.h>
using namespace std;
#define int long long
int mymax(int A,int B)
{
	return A>B? A:B;
}
struct qwerty
{
	int sum[100010*4],mx[100010*4],a[100010];
	#define ls (n<<1)
	#define rs (n<<1|1)
	void pu(int n)
	{
		sum[n]=sum[ls]+sum[rs];
		mx[n]=mymax(mx[ls],mx[rs]);
	}
	void bd(int n,int l,int r)
	{
		if(l==r)
		{
			sum[n]=a[l];
			mx[n]=a[r];
			return;
		}
		int mid=(l+r)>>1;
		bd(ls,l,mid);
		bd(rs,mid+1,r);
		pu(n);
	}
	void cg(int n,int l,int r,int ll,int rr)
	{
		if(l==r)
		{
			sum[n]=sqrt(sum[n]);
			mx[n]=sqrt(mx[n]);
			return;
		}
		int mid=(l+r)>>1;
		if(ll<=mid&&mx[ls]>1)
			cg(ls,l,mid,ll,rr);
		if(rr>mid&&mx[rs]>1)
			cg(rs,mid+1,r,ll,rr);
		pu(n);
	}
	int qu(int n,int l,int r,int ll,int rr)
	{
		if(ll<=l&&r<=rr)
			return sum[n];
		int mid=(l+r)>>1,ans=0;
		if(ll<=mid)
			ans+=qu(ls,l,mid,ll,rr);
		if(rr>mid)
			ans+=qu(rs,mid+1,r,ll,rr);
		return ans;
	}
}xds;
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n,m;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>xds.a[i];
	xds.bd(1,1,n);
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		int k,l,r;
		cin>>k>>l>>r;
		if(l>r)
		{
			int sw=l;
			l=r;
			r=sw;
		}
		if(k==0)
		{
			xds.cg(1,1,n,l,r);
		}
		else
		{
			cout<<xds.qu(1,1,n,l,r)<<'\n';
		}
	}
	return 0;
}
/*

*/
2024/7/31 15:55
加载中...