Advertisement
Guest User

Untitled

a guest
Aug 30th, 2022
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.52 KB | None | 0 0
  1. //#define _GLIBCXX_DEBUG
  2. //#define _GLIBCXX_DEBUG_PEDANTIC
  3. #pragma GCC optimize("O3")
  4. //#pragma GCC target("avx2")
  5. #include"candies.h"
  6. #include"bits/stdc++.h"
  7. using namespace std;
  8.  
  9. typedef long long ll;
  10. typedef long double ld;
  11. vector<int>C;
  12.  
  13. struct Node{
  14.     ll val;
  15.     bool set0,setmax;
  16.     ll add;
  17. };
  18.  
  19. const int NMAX=2e5;
  20. Node tree[4*NMAX+5];
  21.  
  22. void push(int v,int l,int r){
  23.     if(l!=r){
  24.         if(tree[v].set0){
  25.             tree[2*v].set0=tree[2*v+1].set0=1;
  26.             tree[2*v].setmax=tree[2*v+1].setmax=0;
  27.             tree[2*v].add=tree[2*v+1].add=0;
  28.         }
  29.         if(tree[v].setmax){
  30.             tree[2*v].set0=tree[2*v+1].set0=0;
  31.             tree[2*v].setmax=tree[2*v+1].setmax=1;
  32.             tree[2*v].add=tree[2*v+1].add=0;
  33.         }
  34.         tree[2*v].add+=tree[v].add;
  35.         tree[2*v+1].add+=tree[v].add;
  36.     }
  37.     if(tree[v].set0)tree[v].val=0;
  38.     if(tree[v].setmax)tree[v].val=C[l];
  39.     tree[v].val+=tree[v].add;
  40.     tree[v].set0=tree[v].setmax=tree[v].add=0;
  41. }
  42.  
  43. void uset0(int v,int l,int r,int l0,int r0){
  44.     push(v,l,r);
  45.     if(l==l0&&r==r0){
  46.         tree[v].set0=1;
  47.         tree[v].setmax=0;
  48.         tree[v].add=0;
  49.         push(v,l,r);
  50.         return;
  51.     }
  52.     int m=(l+r)/2;
  53.     if(r0<=m)uset0(2*v,l,m,l0,r0),push(2*v+1,m+1,r);
  54.     else if(l0>m)uset0(2*v+1,m+1,r,l0,r0),push(2*v,l,m);
  55.     else uset0(2*v,l,m,l0,m),uset0(2*v+1,m+1,r,m+1,r0);
  56. }
  57. void usetmax(int v,int l,int r,int l0,int r0){
  58.     push(v,l,r);
  59.     if(l==l0&&r==r0){
  60.         tree[v].set0=0;
  61.         tree[v].setmax=1;
  62.         tree[v].add=0;
  63.         push(v,l,r);
  64.         return;
  65.     }
  66.     int m=(l+r)/2;
  67.     if(r0<=m)usetmax(2*v,l,m,l0,r0),push(2*v+1,m+1,r);
  68.     else if(l0>m)usetmax(2*v+1,m+1,r,l0,r0),push(2*v,l,m);
  69.     else usetmax(2*v,l,m,l0,m),usetmax(2*v+1,m+1,r,m+1,r0);
  70. }
  71. void uadd(int v,int l,int r,int l0,int r0,int x){
  72.     push(v,l,r);
  73.     if(l==l0&&r==r0){
  74.         tree[v].set0=0;
  75.         tree[v].setmax=0;
  76.         tree[v].add=x;
  77.         push(v,l,r);
  78.         return;
  79.     }
  80.     int m=(l+r)/2;
  81.     if(r0<=m)uadd(2*v,l,m,l0,r0,x),push(2*v+1,m+1,r);
  82.     else if(l0>m)uadd(2*v+1,m+1,r,l0,r0,x),push(2*v,l,m);
  83.     else uadd(2*v,l,m,l0,m,x),uadd(2*v+1,m+1,r,m+1,r0,x);
  84. }
  85.  
  86. ll get(int v,int l,int r,int pos){
  87.     push(v,l,r);
  88.     if(l==r)return tree[v].val;
  89.     int m=(l+r)/2;
  90.     if(pos<=m)return get(2*v,l,m,pos);
  91.     return get(2*v+1,m+1,r,pos);
  92. }
  93.  
  94.  
  95.  
  96. std::vector<int> distribute_candies(std::vector<int> c, std::vector<int> l,
  97.                                     std::vector<int> r, std::vector<int> v){
  98.     for(auto&[val,set0,setmax,add]:tree){
  99.         val=set0=setmax=add=0;
  100.     }
  101.     int n=c.size();int q=l.size();
  102.     vector<pair<int,int>>vec;
  103.     for(int i=0;i<n;i++)vec.push_back({c[i],i});
  104.     sort(vec.begin(),vec.end());
  105.     for(int i=0;i<n;i++)C.push_back(vec[i].first);
  106.     for(int i=0;i<q;i++){
  107.         int L=-1;int R=n;
  108.         if(v[i]>0){
  109.             while(R>L+1){
  110.                 int m=(L+R)/2;
  111.                 if(get(1,0,n-1,m)+v[i]>=C[m])L=m;
  112.                 else R=m;
  113.             }
  114.             if(L!=-1)usetmax(1,0,n-1,0,L);
  115.             if(R!=n)uadd(1,0,n-1,R,n-1,v[i]);
  116.         }else{
  117.             while(R>L+1){
  118.                 int m=(L+R)/2;
  119.                 if(get(1,0,n-1,m)+v[i]<=0)L=m;
  120.                 else R=m;
  121.             }
  122.             if(L!=-1)uset0(1,0,n-1,0,L);
  123.             if(R!=n)uadd(1,0,n-1,R,n-1,v[i]);
  124.         }
  125.     }
  126.     vector<int>ans(n);
  127.     for(int i=0;i<n;i++){
  128.         ans[vec[i].second]=get(1,0,n-1,i);
  129.     }
  130.     return ans;
  131. }
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement