社区讨论
10ps 求调
P1253扶苏的问题参与者 2已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mhjogu08
- 此快照首次捕获于
- 2025/11/04 05:54 4 个月前
- 此快照最后确认于
- 2025/11/04 05:54 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
long long n,a[4000010],m;
struct segmenttree {
long long l,r;
long long dat,tat;
} t[40000010];
void build(int k,int l,int r) {
t[k].l=l;
t[k].r=r;
t[k].tat=0;
t[k].dat=a[k];
if(l==r) {
return ;
}
int mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
t[k].dat=max(t[k<<1].dat,t[k<<1|1].dat);
}
void spread(long long p) {
if(t[p].tat) {
t[p*2].tat+=t[p].tat;
t[p*2].dat+=t[p].tat;
t[p*2+1].tat+=t[p].tat;
t[p*2+1].dat+=t[p].tat;
t[p].tat=0;
}
}
void modify(long long p,long long l,long long r,long long v) {
if(l<=t[p].l&&r>=t[p].r) {
t[p].dat+=v;
t[p].tat+=v;
return;
}
spread(p);
long long mid=(t[p].l+t[p].r)/2;
if(l<=mid)
modify(2*p,l,r,v);
if(r>mid)
modify(2*p+1,l,r,v);
t[p].dat=max(t[p*2].dat,t[p*2+1].dat);
}
void se(long long p,long long l,long long r,long long v) {
if(l<=t[p].l&&r>=t[p].r) {
t[p].dat=v;
return;
}
long long mid=(t[p].l+t[p].r)/2;
if(l<=mid)
se(2*p,l,r,v);
if(r>mid)
se(2*p+1,l,r,v);
t[p].dat=max(t[p*2].dat,t[p*2+1].dat);
}
long long query(long long p,long long l,long long r) {
if(l<=t[p].l&&t[p].r<=r) {
return t[p].dat;
}
spread(p);
long long mid=(t[p].l+t[p].r)>>1;
long long ans=0;
if(l<=mid)ans=max(ans,query(p*2,l,r));
if(r>mid)ans=max(ans,query(p*2+1,l,r));
return ans;
}
signed main() {
scanf("%lld%lld",&n,&m);
for(int i=1; i<=n; i++) {
cin>>a[i];
}
build(1,1,n);
for(long long i=1; i<=m ; i++) {
long long id,k1,k2;
scanf("%lld%lld%lld",&id,&k1,&k2);
if(id==1) {
cin>>id;
modify(1,k1,k2,id);
} else if(id==3) {
printf("%lld\n",query(1,k1,k2));
} else {
cin>>id;
se(1,k1,k2,id);
}
}
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...