标签:
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