hdu5316线段树

#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 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值