yicongli

T148T1

Mar 11th, 2019
483
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.44 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=1e5+7;
  17.  
  18. struct Node{
  19.     ll mx[8];
  20.     ll tag;
  21.    
  22.     inline void operator += (const ll &x){
  23.         for(int i=0;i<8;++i)mx[i]+=x;
  24.         tag+=x;
  25.     }
  26.    
  27.     inline Node operator +(const Node &x){
  28.         Node ret;
  29.         for(int i=0;i<8;++i){
  30.             ret.mx[i]=max(mx[i],x.mx[i]);
  31.         }
  32.         ret.tag=0;
  33.         return ret;
  34.     }
  35. }tr[N<<2];
  36.  
  37. ll sum;
  38. ll A[N];
  39.  
  40. inline void init(Node &x,int p){
  41.     ll a=A[p];
  42.     ll b=A[p+1];
  43.     ll c=A[p+2];
  44.     ll tmp=sum-abs(a)-abs(b)-abs(c);
  45.     x.mx[0]=tmp+a+b+c;
  46.     x.mx[1]=tmp-a+b+c;
  47.     x.mx[2]=tmp+a-b+c;
  48.     x.mx[3]=tmp+a+b-c;
  49.     x.mx[4]=tmp-a-b+c;
  50.     x.mx[5]=tmp-a+b-c;
  51.     x.mx[6]=tmp+a-b-c;
  52.     x.mx[7]=tmp-a-b-c;
  53. }
  54.  
  55. #define ls (rt<<1)
  56. #define rs (rt<<1|1)
  57.  
  58. inline void update(int rt){
  59.     tr[rt]=tr[ls]+tr[rs];
  60. }
  61.  
  62. void build(int rt,int l,int r){
  63.     if(l==r)return init(tr[rt],l);
  64.     int mid=(l+r)>>1;
  65.     build(ls,l,mid);
  66.     build(rs,mid+1,r);
  67.     update(rt);
  68. }
  69.  
  70. inline void pushdown(int rt){
  71.     if(tr[rt].tag){
  72.         tr[ls]+=tr[rt].tag;
  73.         tr[rs]+=tr[rt].tag;
  74.         tr[rt].tag=0;
  75.     }
  76. }
  77.  
  78. void change(int rt,int l,int r,int x,int y){
  79.     if(l==r)return init(tr[rt],l);
  80.     pushdown(rt);
  81.     int mid=(l+r)>>1;
  82.     if(x<=mid)change(ls,l,mid,x,y);
  83.     if(y>mid)change(rs,mid+1,r,x,y);
  84.     update(rt);
  85. }
  86.  
  87. Node query(int rt,int l,int r,int x,int y){
  88.     if(x<=l&&r<=y)return tr[rt];
  89.     pushdown(rt);
  90.     int mid=(l+r)>>1;
  91.     if(y<=mid)return query(ls,l,mid,x,y);
  92.     if(x>mid)return query(rs,mid+1,r,x,y);
  93.     return query(ls,l,mid,x,y)+query(rs,mid+1,r,x,y);
  94. }
  95.  
  96. int n,m;
  97.  
  98. inline void Change(int l,int r){
  99.     l=max(1,l);
  100.     r=min(r,n);
  101.     if(l<=r)change(1,1,n,l,r);
  102. }
  103.  
  104. inline ll Query(int l,int r,ll v){
  105.     Node t=query(1,1,n,l,r);
  106.     ll ans=0;
  107.     ans=max(ans,t.mx[0]+3*v);
  108.     ans=max(ans,t.mx[1]+1*v);
  109.     ans=max(ans,t.mx[2]+1*v);
  110.     ans=max(ans,t.mx[3]+1*v);
  111.     ans=max(ans,t.mx[4]-1*v);
  112.     ans=max(ans,t.mx[5]-1*v);
  113.     ans=max(ans,t.mx[6]-1*v);
  114.     ans=max(ans,t.mx[7]-3*v);
  115.     return ans;
  116. }
  117.  
  118. int main(){
  119.     freopen("pipi.in","r",stdin);
  120.     freopen("pipi.out","w",stdout);
  121.     r(n),r(m);
  122.     for(int i=1;i<=n;++i)r(A[i]);
  123.     for(int i=1;i<=n;++i){
  124.         sum+=abs(A[i]);
  125.     }
  126.     n-=2;
  127.     build(1,1,n);
  128.     while(m--){
  129.         int opt;r(opt);
  130.         if(opt==1){
  131.             int pos,v;r(pos),r(v);
  132.             int delta=abs(v)-abs(A[pos]);
  133.             tr[1]+=delta;
  134.             sum+=delta;
  135.             A[pos]=v;
  136.             Change(pos-2,pos);
  137.         }
  138.         else {
  139.             int l,r,u;
  140.             r(l),r(r),r(u);
  141.             printf("%lld\n",Query(l,r-2,u));
  142.         }
  143.     }
  144.     return 0;
  145. }
Advertisement
Add Comment
Please, Sign In to add comment