社区讨论
遭遇神秘错误一半 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 条回复,欢迎继续交流。
正在加载回复...