RE求调
查看原帖
RE求调
807403
liyuteng楼主2025/8/29 14:40
#include<bits/stdc++.h>
#define N 100005
#define ll long long
using namespace std;
ll a[N];
struct node{
	ll sum;
	ll mx;
}tree[N<<2];
int ls(int p){
	return p<<1;
}
int rs(int p){
	return p<<1|1; 
}
void push_up(int p){
	tree[p].sum=tree[ls(p)].sum+tree[rs(p)].sum;
	tree[p].mx=max(tree[ls(p)].mx,tree[rs(p)].mx);
	return;
}
void build(int p,int pl,int pr){
	if(pl==pr){
		tree[p].sum=a[pl];
		tree[p].mx=a[pl];
		return;
	}
	int mid=(pl+pr)>>1;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
	push_up(p);
	return;
}
void update(int p,int L,int R,int pl,int pr){
	if(tree[p].mx<=1){
		return;
	}
	//cout<<"update:"<<p<<" "<<L<<" "<<R<<" "<<pl<<" "<<pr<<endl;
	if(pl==pr){
		tree[p].sum=tree[p].mx=sqrtl(tree[p].sum);
		return;
	}
	int mid=(pl+pr)>>1;
	if(L<=mid){
		update(ls(p),L,R,pl,mid);
	}
	if(R>mid){
		update(rs(p),L,R,mid+1,pr);
	}
	push_up(p);
}
ll query(int p,int L,int R,int pl,int pr){
	if(L<=pl&&pr<=R){
		return tree[p].sum;
	}
	int mid=(pl+pr)>>1;
	ll res=0;
	if(L<=mid){
		res+=query(ls(p),L,R,pl,mid);	
	}
	if(R>mid){
		res+=query(rs(p),L,R,mid+1,pr);
	}
	return res;
}
signed main(){
	int cnt=0;
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0); 
	int n;
	while(cin>>n){
		cnt++;
		cout<<"Case #"<<cnt<<":"<<endl;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		build(1,1,n);
		int q;
		cin>>q;
		while(q--){
			int op,x,y;
			cin>>op>>x>>y;
			if(x>y)swap(x,y);
			if(op==1){
				cout<<query(1,x,y,1,n)<<endl;
			}else if(op==0){
				update(1,x,y,1,n);
			}
		}
		cout<<endl;
	}
	return 0;
}

2025/8/29 14:40
加载中...