#include <iostream>
#include <queue>
#include <string>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std ;
typedef long long LL ;
const int maxn = 100002 ;
const LL inf = -1000000000000008L ;
struct E{
LL jj , jo , oo , oj ;
E(LL _jj , LL _jo , LL _oj , LL _oo):jj(_jj),jo(_jo),oj(_oj),oo(_oo){}
E(){}
}elem[maxn<<2] ;
LL a[maxn] ;
E up(E l , E r){
E e ;
e.jj = max(l.jj , r.jj) ;
e.jj = max(e.jj , l.jj + r.oj) ;
e.jj = max(e.jj , l.jo + r.jj) ;
e.jo = max(l.jo , r.jo) ;
e.jo = max(e.jo , l.jj + r.oo) ;
e.jo = max(e.jo , l.jo + r.jo) ;
e.oj = max(l.oj , r.oj) ;
e.oj = max(e.oj , l.oj + r.oj) ;
e.oj = max(e.oj , l.oo + r.jj) ;
e.oo = max(l.oo , r.oo) ;
e.oo = max(e.oo , l.oj + r.oo) ;
e.oo = max(e.oo , l.oo + r.jo) ;
return e ;
}
void make(int l , int r , int t){
if(l == r){
if(l & 1) elem[t] = E(a[l] , inf , inf , inf) ;
else elem[t] = E(inf , inf , inf , a[l]) ;
return ;
}
int m = (l + r) >> 1 ;
make(l , m , t<<1) ;
make(m+1 , r , t<<1|1) ;
elem[t] = up(elem[t<<1] , elem[t<<1|1] ) ;
}
void update(int i , LL d , int l , int r , int t){
if(l == r){
if(i & 1) elem[t].jj = d ;
else elem[t].oo = d ;
return ;
}
int m = (l + r) >> 1 ;
if(i <= m) update(i , d , l , m , t<<1) ;
else update(i , d , m+1 , r , t<<1|1) ;
elem[t] = up(elem[t<<1] , elem[t<<1|1]) ;
}
E ask(int L , int R , int l , int r , int t){
if(L <= l && r <= R) return elem[t] ;
int m = (l + r) >> 1 ;
E e = E(inf , inf , inf , inf) ;
if(L <= m) e = up(e , ask(L , R , l , m , t<<1)) ;
if(R > m) e = up(e , ask(L , R , m+1 , r , t<<1|1)) ;
return e ;
}
int main(){
int t , n , m , l , r , k ;
scanf("%d" , &t) ;
while(t--){
scanf("%d%d" ,&n , &m) ;
for(int i = 1 ; i <= n ; i++) scanf("%I64d" , &a[i]) ;
make(1 , n , 1) ;
while(m--){
scanf("%d%d%d" ,&k , &l , &r) ;
if(k == 0){
E e = ask(l , r , 1 , n , 1) ;
printf("%I64d\n" , max(max(e.jj , e.jo) , max(e.oj , e.oo))) ;
}
else update(l , LL(r) , 1 , n , 1) ;
}
}
return 0 ;
}
hdu5316线段树
最新推荐文章于 2018-08-13 09:43:50 发布