求调
查看原帖
求调
773805
wsm52楼主2025/7/31 15:06
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+10;
int n,m;
LL tree[N*4],a[N];
bool vis[N];
void build(int x,int lf,int rt){
	if(vis[x]) return;
	if(lf==rt){
		tree[x]=a[lf];
		if(tree[x]<=1) vis[x]=true;
		return;
	}
	int mid=lf+rt>>1;
	build(x<<1,lf,mid);
	build(x<<1|1,mid+1,rt);
	tree[x]=tree[x<<1]+tree[x<<1|1];
	if(vis[x<<1]&&vis[x<<1|1]) vis[x]=true;
}
void insert(int x,int lf,int rt,int a,int b){
	if(vis[x]) return;
	if(lf==rt){
		tree[x]=sqrt(tree[x]);
		if(tree[x]<=1) vis[x]=true;
		return;
	}
	int mid=lf+rt>>1;
	if(a<=mid) insert(x<<1,lf,mid,a,b);
	if(b>mid) insert(x<<1|1,mid+1,rt,a,b);
	tree[x]=tree[x<<1]+tree[x<<1|1];
	if(vis[x<<1]&&vis[x<<1|1]) vis[x]=true;
}
LL query(int x,int lf,int rt,int a,int b){
	if(lf>=a&&rt<=b) return tree[x];
	LL sum=0;
	int mid=lf+rt>>1;
	if(a<=mid) sum+=query(x<<1,lf,mid,a,b);
	if(b>mid) sum+=query(x<<1|1,mid+1,rt,a,b);
	return sum;
}
int main(){
	freopen("P4145.in","r",stdin);
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	build(1,1,n);
	scanf("%d",&m);
	int op,l,r;
	while(m--){
		scanf("%d%d%d",&op,&l,&r);
		if(l>r) swap(l,r);
		if(op==0) insert(1,1,n,l,r);
		else printf("%lld\n",query(1,1,n,l,r));
	}
	return 0;
}
2025/7/31 15:06
加载中...