比赛 树形数据结构拔高 评测结果 AAAWWWWWWW
题目名称 HS造题的七分钟 最终得分 30
用户昵称 李奇文 运行时间 0.707 s
代码语言 C++ 内存使用 8.30 MiB
提交时间 2025-04-17 21:33:33
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n,m;
ll a[N];
struct tree{
	int l,r,lz;
	ll su;
}f[4*N];
void build(int p,int l,int r){
	f[p].l=l,f[p].r=r;
	if(l==r){
		f[p].su=a[l];
		f[p].lz=a[l];
		return;
	}
	int mid=(f[p].l+f[p].r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	f[p].su=f[p<<1].su+f[p<<1|1].su;
	if(f[p<<1].lz>f[p<<1|1].lz) f[p].lz=f[p<<1].lz;
	else f[p].lz=f[p<<1|1].lz;
	return;
}
void change(int p,int l,int r){
	if(f[p].l==f[p].r){
		f[p].su=sqrt(f[p].su);
		f[p].lz=sqrt(f[p].lz);
	}else{
		ll mid=(f[p].l+f[p].r)>>1;
		if(l<=mid&&f[p<<1].lz>1) change(p<<1,l,r);
		if(r>mid&&f[p<<1|1].lz>1) change(p<<1|1,l,r);
		f[p].su=f[p<<1].su+f[p<<1|1].su;
		f[p].lz=max(f[p<<1].lz,f[p<<1|1].lz);
	}
	return;
}
ll ask(int p,int l,int r){
	if(l<=f[p].l&&f[p].r<=r){
		return f[p].su;
	}
	ll mid=(f[p].l+f[p].r)>>1,sum=0;
	if(l<=mid) sum+=ask(p<<1,l,r);
	if(r>mid) sum+=ask(p<<1|1,l,r);
	return sum;
}
int main(){
	freopen("hssqrt.in","r",stdin);
	freopen("hssqrt.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		int k,l,r;
		scanf("%d%d%d",&k,&l,&r);
		if(l>r) swap(l,r);
		if(k==0){
			change(1,l,r);
		}else{
			printf("%lld\n",ask(1,l,r));
		}
	}
	return 0;
}