线段树40pts(复杂度应该正确)求调
查看原帖
线段树40pts(复杂度应该正确)求调
587959
ydkxj楼主2024/10/3 12:04
#include<cmath>
#include<iostream>
#include<algorithm>
#define ls (rt<<1)
#define rs (rt<<1)|1
#define il inline
typedef long long ll;
using namespace std;
struct node{
	ll maxn,sum;
}t[2000005];
ll a[2000005];
inline int read(){
    int x=0,w=1;
    char ch=getchar();
    for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
    for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
    return x*w;
}
il void update(ll rt){
	t[rt].maxn=max(t[ls].maxn,t[rs].maxn);
	t[rt].sum=t[ls].sum+t[rs].sum;
}
il void build(ll rt,ll l,ll r){
	if(l==r){
		t[rt].maxn=t[rt].sum=a[l];
		return ;
	}
	ll mid=(r+l)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	update(rt);
}
il void change(ll rt,ll l,ll r,ll L,ll R){
    if(l==r && l>=L && r<=R){
        t[rt].sum=t[rt].sum=sqrt(t[rt].sum);
        return ;
    }   
    ll mid=(r+l)>>1;
    if(L<=mid && t[ls].maxn>1)change(ls,l,mid,L,R);
    if(mid<R && t[rs].maxn>1)change(rs,mid+1,r,L,R);
    update(rt);
}
il ll query(ll rt,ll l,ll r,ll l1,ll r1){
	if(l1<=l&&r<=r1){
		return t[rt].sum;
	}
	ll mid=(r+l)>>1;
	ll ans=0;
	if(l1<=mid)ans+=query(ls,l,mid,l1,r1);
	if(r1>mid)ans+=query(rs,mid+1,r,l1,r1);
	return ans;
}
int main(){
	ll n,m;
	n=read();
	for(int i=1;i<=n;i++)a[i]=read();
	build(1,1,n);
	m=read();
	while(m--){
		ll op,l,r;
		op=read(),l=read(),r=read();
		if(l>r)swap(l,r);
		if(op)cout<<query(1,1,n,l,r)<<"\n";
		else change(1,1,n,l,r);
	}
	return 0;
}
2024/10/3 12:04
加载中...