社区讨论

遭遇神秘错误一半 WA 一半 RE 一个 AC 耗尽所有社团时间无法调出求调

P4145上帝造题的七分钟 2 / 花神游历各国参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mjzo21j6
此快照首次捕获于
2026/01/04 19:46
2 个月前
此快照最后确认于
2026/01/08 13:40
上个月
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
long long n,m;
const long long N=1e5+7;
long long a[N];

namespace ste{
	struct sgtr{
		long long l,r;
		long long data,mx;
		long long g;
	}sgt[4*N];
	long long lfs(long long p){
		return p<<1;
	}
	long long rfs(long long p){
		return p<<1|1;
	}
	long long inr(long long p,long long l,long long r){
		return l<=sgt[p].l&&sgt[p].r<=r;
	}
	void pushup(long long p){
		sgt[p].data=sgt[lfs(p)].data+sgt[rfs(p)].data;
		sgt[p].mx=max(sgt[lfs(p)].mx,sgt[rfs(p)].mx);
	}
	void build(long long p,long long l,long long r){
		sgt[p].l=l;
		sgt[p].r=r;
		sgt[p].data=sgt[p].mx=sgt[p].g=0;
		if(l==r){
			sgt[p].data=a[l];
			sgt[p].mx=sgt[p].data;
			return;
		}
		long long mid=(l+r)>>1;
		build(lfs(p),l,mid);
		build(rfs(p),mid+1,r);
		pushup(p);
	}
	void upd(long long p,long long l,long long r){
		if(inr(p,l,r)&&l==r){
			sgt[p].data=sqrt(sgt[p].data);
			sgt[p].mx=sgt[p].data;
			return;
		}
		long long mid=(sgt[p].l+sgt[p].r)>>1;
		if(l<=mid&&sgt[lfs(p)].mx>1){
			upd(lfs(p),l,r);
		}
		if(mid<r&&sgt[rfs(p)].mx>1){
			upd(rfs(p),l,r);
		}
		pushup(p);
	}
	long long query(long long p,long long l,long long r){
		if(inr(p,l,r)){
			return sgt[p].data;
		}
		long long res=0,mid=(sgt[p].l+sgt[p].r)>>1;
		if(l<=mid){
			res+=query(lfs(p),l,r); 
		}
		if(mid<r){
			res+=query(rfs(p),l,r);
		} 
		return res;
	}
}
signed main(){
	cin.tie(0)->sync_with_stdio(0);
	cin>>n;
	for(long long i=1;i<=n;i++){
		cin>>a[i];
	}
	ste::build(1,1,n);
	cin>>m;
	while(m--){
		long long k,l,r;
		cin>>k>>l>>r;
		if(l>r) swap(l,r);
		if(k==0){
			ste::upd(1,l,r);
		}
		if(k==1){
			cout<<ste::query(1,l,r)<<'\n';
		}
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...