标签:

1 1 1 1 0 1 1
1
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<math.h>
#include<string>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define INF -0x7fffffff
#define MAXN 100100
struct node{//奇奇,奇偶,偶奇,偶偶4种情况
long long jj;
long long jo;
long long oj;
long long oo;
}num[4*MAXN];
int temp[MAXN];
void build(int l,int r,int root){
if(l==r){
if(l%2==1){
num[root].jj=temp[l];
num[root].jo=INF;
num[root].oj=INF;
num[root].oo=INF;
}
else{
num[root].jj=INF;
num[root].jo=INF;
num[root].oj=INF;
num[root].oo=temp[l];
}
return;
}//if
int mid=(l+r)/2;
build(l,mid,root<<1);
build(mid+1,r,root<<1|1);
num[root].jj=max(num[root<<1].jj,max(num[root<<1|1].jj,max(num[root<<1].jj+num[root<<1|1].oj,num[root<<1].jo+num[root<<1|1].jj)));//合并
num[root].jo=max(num[root<<1].jo,max(num[root<<1|1].jo,max(num[root<<1].jo+num[root<<1|1].jo,num[root<<1].jj+num[root<<1|1].oo)));
num[root].oj=max(num[root<<1].oj,max(num[root<<1|1].oj,max(num[root<<1].oj+num[root<<1|1].oj,num[root<<1].oo+num[root<<1|1].jj)));
num[root].oo=max(num[root<<1].oo,max(num[root<<1|1].oo,max(num[root<<1].oo+num[root<<1|1].jo,num[root<<1].oj+num[root<<1|1].oo)));
}
void update(int l,int r,int root,int goal,int val){
if(l==r&&goal==l){
if(l%2==1){
num[root].jj=val;
num[root].jo=INF;
num[root].oj=INF;
num[root].oo=INF;
}
else{
num[root].jj=INF;
num[root].jo=INF;
num[root].oj=INF;
num[root].oo=val;
}
return;
}//if
int mid=(l+r)/2;
if(goal<=mid)
update(l,mid,root<<1,goal,val);
else
update(mid+1,r,root<<1|1,goal,val);
num[root].jj=max(num[root<<1].jj,max(num[root<<1|1].jj,max(num[root<<1].jj+num[root<<1|1].oj,num[root<<1].jo+num[root<<1|1].jj)));
num[root].jo=max(num[root<<1].jo,max(num[root<<1|1].jo,max(num[root<<1].jo+num[root<<1|1].jo,num[root<<1].jj+num[root<<1|1].oo)));
num[root].oj=max(num[root<<1].oj,max(num[root<<1|1].oj,max(num[root<<1].oj+num[root<<1|1].oj,num[root<<1].oo+num[root<<1|1].jj)));
num[root].oo=max(num[root<<1].oo,max(num[root<<1|1].oo,max(num[root<<1].oo+num[root<<1|1].jo,num[root<<1].oj+num[root<<1|1].oo)));
}
node qurey(int l,int r,int root,int L,int R){
if(L<=l&&R>=r){
return num[root];
}
int mid=(l+r)/2;
if(R<=mid)
return qurey(l,mid,root<<1,L,R);
else if(mid<L)
return qurey(mid+1,r,root<<1|1,L,R);
else{
node u=qurey(l,mid,root<<1,L,R);
node v=qurey(mid+1,r,root<<1|1,L,R);
node tans;
tans.jj=max(u.jj,max(v.jj,max(u.jj+v.oj,u.jo+v.jj)));
tans.jo=max(u.jo,max(v.jo,max(u.jo+v.jo,u.jj+v.oo)));
tans.oj=max(u.oj,max(v.oj,max(u.oj+v.oj,u.oo+v.jj)));
tans.oo=max(u.oo,max(v.oo,max(u.oo+v.jo,u.oj+v.oo)));
return tans;
}
}
int main(){
//freopen("G://test.txt","r",stdin);
int t,n,m;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",&temp[i]);
build(1,n,1);
int ml,x,y;
for(int i=1;i<=m;++i){
scanf("%d%d%d",&ml,&x,&y);
if(ml==1){
update(1,n,1,x,y);
}
else{
node ans=qurey(1,n,1,x,y);
long long aa=ans.jj;
if(ans.jo>aa)
aa=ans.jo;
if(ans.oj>aa)
aa=ans.oj;
if(ans.oo>aa)
aa=ans.oo;
printf("%lld\n",aa);
}
}
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/classicshao/article/details/47124999