40pts TLE #5~10
查看原帖
40pts TLE #5~10
1079531
lcycl楼主2024/10/7 09:37

玄关,求条

#include<math.h>
#include<iostream>
using namespace std;
long long t[400001];
long long bb[400001];
int n,m;
void plant(int le,int re,int po){
    if(le==re){
        t[po]=bb[le];
    }
    else{
        int m=(le+re)/2;
        plant(le, m, po*2);
        plant( m+1, re,po*2+1);
        t[po]=t[po*2]+t[po*2+1];
    }
    return ;
}
void tree_sqrt(int l,int r,int le,int re,int po){
    if(re<l || r<le ) return ;
	if(l==r){
		t[po]=sqrt(t[po]);
        return;
	}
	int mid=(l+r)/2;
    tree_sqrt(l,mid,le,re,po*2);
	tree_sqrt(mid+1,r,le,re,po*2+1);
	t[po]=t[po*2]+t[po*2+1];
    return ;
}
long long tree_sum(int l,int r,int le,int re,int po){
//	cout<<po<<"-->"<<t[po]<<" ";
    if(re<l || r<le){
        return 0;
    }
	if(le<=l&&r<=re){
		
		return t[po];
	}
	int mid=(l+r)/2;
    return (tree_sum(l,mid,le,re,po*2)+tree_sum(mid+1,r,le,re,po*2+1));
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&bb[i]);
    }scanf("%d",&m);
    plant(1,n,1);
	for(int i=1;i<=m;i++){
		int x;
		scanf("%d",&x);
		int l,r;
		scanf("%d %d",&l,&r);
		if(l>r) swap(l,r);
		if(x==0){
			tree_sqrt(1,n,l,r,1);
		}
		else {
			printf("%lld\n",tree_sum(1,n,l,r,1));
		}
	}	
	return 0;
}
2024/10/7 09:37
加载中...