比较裸的一颗线段树
你需要维护的是 奇奇、奇偶,偶奇,偶偶四个信息
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
const LL INF = 0x3f3f3f3f3f3f3f3fll;
const int maxn = 100000+10;
int N,M,T;
struct Info{
LL v[2][2];
void maintain(LL x){
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++)
v[i][j] = x;
}
Info(){
maintain(-INF);
}
LL value(){
LL a = max(v[0][0],v[0][1]);
LL b = max(v[1][0],v[1][1]);
return max(a,b);
}
};
Info operator + (const Info & a,const Info & b){
Info ret;
for(int i = 0; i <= 1; i++)
for(int j = 0; j <= 1; j++){
LL & V = ret.v[i][j];
V = max(a.v[i][j],b.v[i][j]);
V = max(V,a.v[i][0]+b.v[1][j]);
V = max(V,a.v[i][1]+b.v[0][j]);
}
return ret;
}
Info val[maxn<<2];
#define Now int now,int l,int r
#define Mid int m = (l+r)>>1
#define lson now<<1,l,m
#define rson now<<1|1,m+1,r
#define root 1,1,N
void update(Now,int p,LL v){
if(l == r){
val[now].maintain(-INF);
val[now].v[l%2][l%2] = v;
return;
}
Mid;
if(p <= m)
update(lson,p,v);
else
update(rson,p,v);
val[now] = val[now<<1]+val[now<<1|1];
}
Info query(Now,int ql,int qr){
if(ql <= l && r <= qr){
return val[now];
}
Mid;
Info ret;
if(ql<=m)
ret = ret + query(lson,ql,qr);
if(qr>m)
ret = ret + query(rson,ql,qr);
return ret;
}
int main(){
ios::sync_with_stdio(false);
int ch,ql,qr,pos;
LL x;
cin>>T;
while(T--){
cin>>N>>M;
for(int i = 1; i <= N; i++){
cin>>x;
update(root,i,x);
}
while(M--){
cin>>ch;
if(!ch){
cin>>ql>>qr;
Info ans = query(root,ql,qr);
cout<<ans.value()<<endl;
}
else{
cin>>pos>>x;
update(root,pos,x);
}
}
}
}