线段树50pts求调
查看原帖
线段树50pts求调
727185
TimelessWelkin楼主2024/4/17 22:30
#include<bits/stdc++.h>
using namespace std;
struct Node{
	long long l,r,val,max;
}a[400005];
void init(long long l,long long r,long long i){
	if(l==r){
		a[i].l=l;
		a[i].r=r;
	}
	else {
		a[i].l=l;
		a[i].r=r;
		long long mid=(l+r)>>1;
		init(l,mid,i*2);
		init(mid+1,r,i*2+1);
	}
	return ;
}
void build_tree(long long i){
	if(a[i].l==a[i].r){
		scanf("%lld",&a[i].val);
		a[i].max=a[i].val;
	}
	else {
		build_tree(i*2);
		build_tree(i*2+1);
		a[i].max=max(a[i*2+1].max,a[i*2].max);
		a[i].val=a[i*2+1].val+a[i*2].val;
	}
	return ;
}
void change(long long l,long long r,long long i){
	if(a[i].max<2){
		return ;
	}
	if(a[i].l > r || a[i].r < l)return ;
	if(a[i].l==a[i].r){
		a[i].val=sqrt(a[i].val);
		a[i].max=a[i].val;
		return ;
	}
	change(l,r,i*2);
	change(l,r,i*2+1);
	a[i].val=a[i*2].val+a[i*2+1].val;
	a[i].max=max(a[i*2].max,a[i*2+1].max);
	return ;
}
long long query(long long l,long long r,long long i){
	if(a[i].l>=l && a[i].r<=r)return a[i].val;
	if(a[i].l>r || a[i].r<l)return 0;
	return query(l,r,i*2)+query(l,r,i*2+1);
}
int main(){
	//freopen("P4145_1.in","r",stdin);
	long long n;
	cin>>n;
	init(1,n,1);
	build_tree(1);
	long long m;
	scanf("%lld",&m);
	while(m--){
		long long k,l,r;
		scanf("%lld%lld%lld",&k,&l,&r);
		if(l>r)swap(l,r);
		if(k==0){
			change(l,r,1);
		//	for(long long i=1;i<=4*n;i++){
		//		if(a[i].l==a[i].r && a[i].l!=0){
			//		cout<<a[i].l<<" "<<a[i].val<<endl;
			//	}
			//}
		}
		else {
			printf("%d\n",query(l,r,1));
		}
	}
	return 0;
}

正确:前五个点

2024/4/17 22:30
加载中...