社区讨论
蒟蒻线段树求调
P1253扶苏的问题参与者 4已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo89g7l5
- 此快照首次捕获于
- 2023/10/27 14:57 2 年前
- 此快照最后确认于
- 2023/10/27 14:57 2 年前
CPP
#include<bits/stdc++.h>
#define N 10000086
#define int long long
using namespace std;
const int M=214748364700;
int n,m,a[N],dat[N],lazy[N],mul[N];
void build(int x,int l,int r) {
if(l==r) {
dat[x]=a[l];
lazy[x]=0;
mul[x]=-M;
return;
}
int mid=(l+r)>>1;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
dat[x]=max(dat[x*2],dat[x*2+1]);
}
inline void down2(int x) {
if(mul[x]!=-M) {
lazy[x<<1]=lazy[x<<1|1]=0;
mul[x<<1]=mul[x<<1|1]=mul[x];
dat[x<<1]=dat[x<<1|1]=mul[x];
mul[x]=-M;
}
}
inline void down1(int x) {
if(lazy[x]) {
down2(x);
dat[x<<1]+=lazy[x],dat[x<<1|1]+=lazy[x];
lazy[x<<1]+=lazy[x],lazy[x<<1|1]+=lazy[x];
lazy[x]=0;
}
}
inline void pushdown(int x) {
down2(x),down1(x);
}
inline void Change1(int L,int R,int l,int r,int x,int p) {//+
if(L<=l&&R>=r) {
down2(x);
dat[x]+=p;
lazy[x]+=p;
return;
}
pushdown(x);
int mid=(l+r)>>1;
if(L<=mid)Change1(L,R,l,mid,x<<1,p);
if(R>mid)Change1(L,R,mid+1,r,x<<1|1,p);
dat[x]=max(dat[x<<1],dat[x<<1|1]);
}
inline void Change2(int L,int R,int l,int r,int x,int p) {
if(L<=l&&R>=r){
lazy[x]=0;
dat[x]=p;
mul[x]=p;
return;
}
pushdown(x);
int mid=(l+r)>>1;
if(L<=mid)Change2(L,R,l,mid,x<<1,p);
if(R>mid)Change2(L,R,mid+1,r,x<<1|1,p);
dat[x]=max(dat[x<<1],dat[x<<1|1]);
}
int qjck(int L, int R, int l, int r, int p) {
if(L<=l&&r<=R) return dat[p];
int mid=(l+r)>>1, res=-M;
if(mid>=L)res=max(res, qjck(L,R,l,mid,p<<1));
if(mid<=R)res=max(res, qjck(L,R,mid+1,r,p<<1|1));
return res;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
for(int i=1; i<=n; i++)
cin>>a[i];
build(1,1,n);
for (int i = 1;i <= n * 4; ++ i) mul[i] = -M;
for(int j=1; j<=m; j++) {
int s,x,y,k;
cin>>s>>x>>y;
if(s==3) {
cout<<qjck(1,n,x,y,1)<<'\n';
}
else {
cin>>k;
if(s==1)Change2(1,n,x,y,1,k);
else Change1(1,n,x,y,1,k);
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...