Advertisement
Guest User

Untitled

a guest
Dec 15th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.94 KB | None | 0 0
  1. //USACO 2013 December Contest, Gold Problem 2. Optimal Milking
  2.  
  3.  
  4. #include<bits/stdc++.h>
  5. #define pb push_back
  6. #define ff first
  7. #define ss second
  8. #define m_p make_pair
  9. #define l_b lower_bound
  10. #define u_b upper_bound
  11. #define ll long long int
  12. #define eps 1e-9
  13. #define inf 1e9
  14. using namespace std;
  15. int a[50100];
  16. struct data
  17. {
  18.     ll ylyr,ylnr,nlnr,nlyr;
  19.     void init(int val)
  20.     {
  21.         ylyr=ylnr=nlnr=nlyr=0;
  22.         ylyr=val;
  23.     }
  24.     ll getmax()
  25.     {
  26.         return max(ylyr,max(ylnr,max(nlyr,nlnr)));
  27.     }
  28. }dnull;
  29.  
  30. struct SegementTree
  31. {
  32.     static const int maxN = 50100;
  33.     int n;
  34.     data tree[maxN*4];
  35.  
  36.     SegementTree(){};
  37.     void setN(int _n)
  38.     {
  39.         this->n=_n;
  40.     }
  41.     inline data merge(data lft_v,data rgt_v)//these two are values, NOT indexes
  42.     {
  43.         data res;
  44.         res.init(0);
  45.         res.ylyr=max( max(lft_v.ylyr+rgt_v.nlyr,lft_v.ylnr+rgt_v.ylyr) , lft_v.ylnr+rgt_v.nlyr);
  46.         res.ylnr=max(max(lft_v.ylyr + rgt_v.nlnr ,lft_v.ylnr+rgt_v.ylnr),lft_v.ylnr+rgt_v.nlnr);
  47.         res.nlnr=max(max(lft_v.nlyr + rgt_v.nlnr ,lft_v.nlnr+rgt_v.ylnr),lft_v.nlnr+rgt_v.nlnr);
  48.         res.nlyr=max(max(lft_v.nlyr + rgt_v.nlyr ,lft_v.nlnr+rgt_v.ylyr),lft_v.nlnr+rgt_v.nlyr);
  49.         return res;
  50.     }
  51.     void update(int cn,int st,int ed,int l,int r,int v)
  52.     {
  53.         if(l>ed || r<st) return;
  54.         if(st>=l && ed<=r)
  55.         {
  56.             tree[cn].init(v);
  57.             return;
  58.         }
  59.         int mid=(st+ed)>>1,lft=cn*2,rgt=lft+1;
  60.         update(lft,st,mid,l,r,v);
  61.         update(rgt,mid+1,ed,l,r,v);
  62.         tree[cn]=merge(tree[lft],tree[rgt]);
  63.     }
  64.  
  65.     void update(int v,int l,int r=-1)//updatedValue , indexes
  66.     {
  67.          if(r==-1) r=l;
  68.          update(1,1,n,l,r,v);
  69.     }
  70. }S;
  71.  
  72.  
  73. int main()
  74. {
  75.     int n,q;
  76.     cin>>n>>q;
  77.     for(int i=1;i<=n;i++) cin>>a[i];
  78.     S.setN(n);
  79.     for(int i=1;i<=n;i++) S.update(a[i],i);
  80.     ll ans=0;
  81.     for(int i=1;i<=q;i++)
  82.     {
  83.         int p,amount;
  84.         cin>>p>>amount;
  85.         S.update(amount,p);
  86.         ans+=S.tree[1].getmax();
  87.     }
  88.     cout<<ans<<endl;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement