不开O2全RE,开了AC?
查看原帖
不开O2全RE,开了AC?
452438
_Minecraft12345楼主2023/7/25 11:45

这是代码:

#include<bits/stdc++.h>
#define ls(x) x*2
#define rs(x) x*2+1
#define int long long
using namespace std;
int l[400010],r[400010],a[400010],sum[400010];bool tag[400010];//tag表示是否都为1 
void pushup(int x){
	/*if(tag[ls(x)]){
		sum[ls(x)]=r[ls(x)]-l[ls(x)]+1;
	} 
	if(tag[rs(x)]){
		sum[rs(x)]=r[rs(x)]-l[rs(x)]+1;
	}*/
	tag[x]= (tag[ls(x)]&tag[rs(x)]);
	sum[x]=sum[ls(x)]+sum[rs(x)];
}
void build(int x,int left,int right){
	l[x]=left,r[x]=right;
	if(left==right){
		sum[x]=a[left];
		return;
	}
	int mid=(left+right)/2;
	build(ls(x),left,mid);
	build(rs(x),mid+1,right);
	pushup(x);
}
void update(int x,int left,int right){
	if(tag[x])return;
	if(l[x]==r[x]){
		sum[x]=sqrt(sum[x]);
		if(sum[x]==1)tag[x]=1;
		return;
	}
	int mid=(r[x]+l[x])/2;
	if(left<=mid)update(ls(x),left,right);
	if(right>mid)update(rs(x),left,right);
	pushup(x); 
} 
int query(int x,int left,int right){
	if(l[x]==left&&r[x]==right){
		return sum[x];
	}
/*	if(tag[x]){
		return sum[x]=r[x]-l[x]+1;
	}*/
	int mid=(r[x]+l[x])/2;
	int ans=0;
	if(left<=mid)ans+=query(ls(x),left,min(mid,right));
	if(right>mid)ans+=query(rs(x),max(mid+1,left),right);
	return ans;
}
signed main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i]; 
	}build(1,1,n);
	int m;
	cin>>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)update(1,l,r);
		else printf("%lld\n",query(1,l,r));
	}
	return 0;
}

求问题所在

2023/7/25 11:45
加载中...