Genshin 里面的 v[0] 表示区间历史最大值,v[1] 表示区间最大值,v[2]=0,然后正常矩乘。
#include<bits/stdc++.h>
#define ls ((rt)<<1)
#define rs ((rt)<<1|1)
#define int long long
using namespace std;
const int N=1e5+10,inf=0xcfcfcfcfcfcfcfcf;
int n,q,a[N];
struct Matrix {
int v[3][3];
void cl() { memset(v,0,sizeof(v)); }
Matrix() { memset(v,0,sizeof(v)); }
int *operator [](const int x) { return v[x]; }
friend Matrix operator *(Matrix x,Matrix y) {
Matrix res;
res[0][0]=max({x[0][0]+y[0][0],x[0][1]+y[1][0],x[0][2]+y[2][0]});
res[0][1]=max({x[0][0]+y[0][1],x[0][1]+y[1][1],x[0][2]+y[2][1]});
res[0][2]=max({x[0][0]+y[0][2],x[0][1]+y[1][2],x[0][2]+y[2][2]});
res[1][0]=max({x[1][0]+y[0][0],x[1][1]+y[1][0],x[1][2]+y[2][0]});
res[1][1]=max({x[1][0]+y[0][1],x[1][1]+y[1][1],x[1][2]+y[2][1]});
res[1][2]=max({x[1][0]+y[0][2],x[1][1]+y[1][2],x[1][2]+y[2][2]});
res[2][0]=max({x[2][0]+y[0][0],x[2][1]+y[1][0],x[2][2]+y[2][0]});
res[2][1]=max({x[2][0]+y[0][1],x[2][1]+y[1][1],x[2][2]+y[2][1]});
res[2][2]=max({x[2][0]+y[0][2],x[2][1]+y[1][2],x[2][2]+y[2][2]});
return res;
}
friend void operator *=(Matrix &x,Matrix y) { x=x*y; }
};
struct Genshin {
int v[3];
void cl() { memset(v,0,sizeof(v)); }
Genshin() { memset(v,0,sizeof(v)); }
int &operator [](int x) { return v[x]; }
friend Genshin operator +(Genshin x,Genshin y) {
Genshin res;
res[0]=max(x[0],y[0]);
res[1]=max(x[1],y[1]);
return res;
}
friend Genshin operator *(Genshin x,Matrix y) {
Genshin res;
res[0]=max({x[0]+y[0][0],x[1]+y[1][0],x[2]+y[2][0]});
res[1]=max({x[0]+y[0][1],x[1]+y[1][1],x[2]+y[2][1]});
res[2]=max({x[0]+y[0][2],x[1]+y[1][2],x[2]+y[2][2]});
return res;
}
friend void operator *=(Genshin &x,Matrix y) { x=x*y; }
};
struct Node { Genshin val; Matrix tag; bool vis; } t[N<<2];
void pushdown(int rt) {
if(!t[rt].vis) return;
t[ls].val*=t[rt].tag,t[rs].val*=t[rt].tag;
t[ls].tag*=t[rt].tag,t[rs].tag*=t[rt].tag;
t[ls].vis=true,t[rs].vis=true;
t[rt].vis=false,t[rt].tag.cl();
}
void upd(int rt,int l,int r,int L,int R,Matrix v) {
if(L<=l&&r<=R) {
t[rt].val=t[rt].val*v;
t[rt].tag=t[rt].tag*v;
return t[rt].vis=true,void();
}
int mid=(l+r)>>1; pushdown(rt);
if(L<=mid) upd(ls,l,mid,L,R,v);
if(R>mid) upd(rs,mid+1,r,L,R,v);
t[rt].val=t[ls].val+t[rs].val;
}
int qryh(int rt,int l,int r,int L,int R) {
if(L<=l&&r<=R) return t[rt].val[0];
int mid=(l+r)>>1,res=inf; pushdown(rt);
if(L<=mid) res=max(res,qryh(ls,l,mid,L,R));
if(R>mid) res=max(res,qryh(rs,mid+1,r,L,R));
return res;
}
int qrym(int rt,int l,int r,int L,int R) {
if(L<=l&&r<=R) return t[rt].val[1];
int mid=(l+r)>>1,res=inf; pushdown(rt);
if(L<=mid) res=max(res,qrym(ls,l,mid,L,R));
if(R>mid) res=max(res,qrym(rs,mid+1,r,L,R));
return res;
}
void build(int rt,int l,int r) {
if(l==r) return t[rt].val[0]=t[rt].val[1]=a[l],void();
int mid=(l+r)>>1; build(ls,l,mid),build(rs,mid+1,r);
t[rt].val=t[ls].val+t[rs].val;
}
void solve() {
char op; int x,y,z;
cin>>op>>x>>y;
if(op=='Q') return cout<<qrym(1,1,n,x,y)<<"\n",void();
if(op=='A') return cout<<qryh(1,1,n,x,y)<<"\n",void();
cin>>z;
if(op=='P') {
Matrix v;
memset(v.v,0xcf,sizeof(v.v));
v[0][0]=v[1][1]=z,v[2][2]=0;
return upd(1,1,n,x,y,v),void();
}
Matrix v;
memset(v.v,0xcf,sizeof(v.v));
v[2][0]=v[2][1]=z,v[0][0]=v[2][2]=0;
upd(1,1,n,x,y,v);
}
signed main() {
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n; for(int i=1;i<=n;++i) cin>>a[i];
build(1,1,n),cin>>q;
while(q--) solve();
return 0;
}