50pts求条
查看原帖
50pts求条
893608
cx2021ghj楼主2024/10/24 07:52
#include<bits/stdc++.h>
#define ls p<<1
#define rs p<<1|1
using namespace std;
int a[1000009],n,m,l,r,op;
struct ghj{
	int maxx,sum;
}tr[4000009];
void pushup(int p){
	tr[p].maxx=max(tr[ls].maxx,tr[rs].maxx);
	tr[p].sum=tr[ls].sum+tr[rs].sum;
}
void build(int l,int r,int p=1){
	if(l==r){
		tr[p].sum=tr[p].maxx=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,ls);
	build(mid+1,r,rs);
	pushup(p);
}
void update(int l,int r,int L,int R,int p=1){
	if(l==r && l>=L && r<=R){
		tr[p].sum=tr[p].maxx=sqrt(tr[p].sum);
		return;
	}
	int mid=(l+r)/2;
	if(L<=mid && tr[ls].maxx>1) update(l,mid,L,R,ls);
	if(mid<R && tr[rs].maxx>1)update(mid+1,r,L,R,rs);
	pushup(p);
}
int query(int l,int r,int L,int R,int p=1){
	if(L<=l && r<=R) return tr[p].sum;
	int mid=(l+r)/2,ans=0;
	if(L<=mid) ans+=query(l,mid,L,R,ls);
	if(mid<R) ans+=query(mid+1,r,L,R,rs);
	return ans;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,n);
	cin>>m;
	while(m--){
		cin>>op>>l>>r;
		if(l>r) swap(l,r);
		if(op==0) update(1,n,l,r);
		else cout<<query(1,n,l,r)<<'\n';
	}
}
2024/10/24 07:52
加载中...