50分代码,那位dailao帮忙调一下(感谢)
查看原帖
50分代码,那位dailao帮忙调一下(感谢)
1294257
zyx_Henry楼主2024/7/23 23:21
#include<bits/stdc++.h>
using namespace std;
#define int long long
long long a[100005],tr[(1<<18)+5],m[(1<<18)+5];
void inline init_line_tree(int u,int lt,int rt)
{
	if(lt>=rt)
	{
		tr[u]=m[u]=a[lt];
		return ;
	}
	long long mid=(lt+rt)>>1;
	init_line_tree(u<<1,lt,mid);
	init_line_tree(u<<1|1,mid+1,rt);
	tr[u]=tr[u<<1]+tr[u<<1|1];
	m[u]=max(m[u<<1],m[u<<1|1]);
}
void inline update_line_tree(int u,int lt,int rt,int lq,int rq)
{
	if(m[u]==1||m[u]==0)
		return ;
	if(lt==rt)
	{
		m[u]=tr[u]=sqrt(tr[u]);
		return ;
	}
	long long mid=(lt+rt)>>1;
	if(lq<=mid)
		update_line_tree(u<<1,lt,mid,lq,rq);
	if(mid<rq)
		update_line_tree(u<<1|1,mid+1,rt,lq,rq);
	tr[u]=tr[u<<1]+tr[u<<1|1];
	m[u]=max(m[u<<1],m[u<<1|1]);
}
long long inline query_line_tree(int u,int lt,int rt,int lq,int rq)
{
	long long sum=0;
	if(lq<=lt&&rt<=rq)
		return tr[u];
	long long mid=(lt+rt)>>1;
	if(lq<=mid) 
		sum+=query_line_tree(u<<1,lt,mid,lq,rq);
	if(rq>mid) 
		sum+=query_line_tree(u<<1|1,mid+1,rt,lq,rq);
	return sum;
}
signed main()
{
	int n,q,i,c,k,b;
	scanf("%lld",&n);
	for(i=1;i<=n;++i)
		scanf("%lld",&a[i]);
	init_line_tree(1,1,n);
	scanf("%lld",&q);
	for(i=0;i<q;++i)
	{
		scanf("%lld %lld %lld",&k,&b,&c);
		if(k==1)
		{
			printf("%lld\n",query_line_tree(1,1,n,b,c));
		}
		else
		{
			update_line_tree(1,1,n,b,c);
		}
	}
	return 0;
}
2024/7/23 23:21
加载中...