https://www.luogu.com.cn/problem/SP1716
学习自洛谷日报https://www.luogu.com.cn/blog/gkxx-is-here/what-the-hell-is-ddp
之前从知乎上学的有问题。。。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=1e6+10;
const ll inf=1ll<<60;
int n,q,cas;ll ans;
ll a[maxl];
struct matrix
{
ll a[3][3];
matrix()
{
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
a[i][j]=-inf;
}
matrix operator * (const matrix &b)const
{
matrix ret;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
for(int k=0;k<3;k++)
ret.a[i][k]=max(ret.a[i][k],a[i][j]+b.a[j][k]);
return ret;
}
};
struct node
{
int l,r;
matrix a;
}tr[maxl*4];
inline void upda(matrix &d,ll x)
{
d.a[0][0]=d.a[0][2]=x;d.a[0][1]=-inf;
d.a[1][0]=d.a[1][2]=x;d.a[1][1]=0;
d.a[2][0]=d.a[2][1]=-inf;d.a[2][2]=0;
}
inline void build(int k,int l,int r)
{
tr[k].l=l;tr[k].r=r;
if(l==r)
{
upda(tr[k].a,a[l]);
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
tr[k].a=tr[k<<1].a*tr[k<<1|1].a;
}
inline void prework()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
}
inline void upd(int k,int l,int x)
{
if(tr[k].l==tr[k].r)
{
upda(tr[k].a,x);
return;
}
int mid=(tr[k].l+tr[k].r)>>1;
if(l<=mid)
upd(k<<1,l,x);
else
upd(k<<1|1,l,x);
tr[k].a=tr[k<<1].a*tr[k<<1|1].a;
}
inline matrix qry(int k,int l,int r)
{
if(tr[k].l==l && tr[k].r==r)
return tr[k].a;
int mid=(tr[k].l+tr[k].r)>>1;
if(r<=mid)
return qry(k<<1,l,r);
else if(l>mid)
return qry(k<<1|1,l,r);
else
return qry(k<<1,l,mid)*qry(k<<1|1,mid+1,r);
}
inline void mainwork()
{
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
int op,x,y;
scanf("%d%d%d",&op,&x,&y);
if(op==0)
{
upd(1,x,y);
a[x]=y;
}
else
{
matrix tmp=qry(1,x,y);
ans=max(tmp.a[1][0],tmp.a[1][2]);
printf("%lld\n",ans);
}
}
}
inline void print()
{
}
int main()
{
int t=1;
//scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}