Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#define _GLIBCXX_DEBUG
- //#define _GLIBCXX_DEBUG_PEDANTIC
- #pragma GCC optimize("O3")
- //#pragma GCC target("avx2")
- #include"candies.h"
- #include"bits/stdc++.h"
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- vector<int>C;
- struct Node{
- ll val;
- bool set0,setmax;
- ll add;
- };
- const int NMAX=2e5;
- Node tree[4*NMAX+5];
- void push(int v,int l,int r){
- if(l!=r){
- if(tree[v].set0){
- tree[2*v].set0=tree[2*v+1].set0=1;
- tree[2*v].setmax=tree[2*v+1].setmax=0;
- tree[2*v].add=tree[2*v+1].add=0;
- }
- if(tree[v].setmax){
- tree[2*v].set0=tree[2*v+1].set0=0;
- tree[2*v].setmax=tree[2*v+1].setmax=1;
- tree[2*v].add=tree[2*v+1].add=0;
- }
- tree[2*v].add+=tree[v].add;
- tree[2*v+1].add+=tree[v].add;
- }
- if(tree[v].set0)tree[v].val=0;
- if(tree[v].setmax)tree[v].val=C[l];
- tree[v].val+=tree[v].add;
- tree[v].set0=tree[v].setmax=tree[v].add=0;
- }
- void uset0(int v,int l,int r,int l0,int r0){
- push(v,l,r);
- if(l==l0&&r==r0){
- tree[v].set0=1;
- tree[v].setmax=0;
- tree[v].add=0;
- push(v,l,r);
- return;
- }
- int m=(l+r)/2;
- if(r0<=m)uset0(2*v,l,m,l0,r0),push(2*v+1,m+1,r);
- else if(l0>m)uset0(2*v+1,m+1,r,l0,r0),push(2*v,l,m);
- else uset0(2*v,l,m,l0,m),uset0(2*v+1,m+1,r,m+1,r0);
- }
- void usetmax(int v,int l,int r,int l0,int r0){
- push(v,l,r);
- if(l==l0&&r==r0){
- tree[v].set0=0;
- tree[v].setmax=1;
- tree[v].add=0;
- push(v,l,r);
- return;
- }
- int m=(l+r)/2;
- if(r0<=m)usetmax(2*v,l,m,l0,r0),push(2*v+1,m+1,r);
- else if(l0>m)usetmax(2*v+1,m+1,r,l0,r0),push(2*v,l,m);
- else usetmax(2*v,l,m,l0,m),usetmax(2*v+1,m+1,r,m+1,r0);
- }
- void uadd(int v,int l,int r,int l0,int r0,int x){
- push(v,l,r);
- if(l==l0&&r==r0){
- tree[v].set0=0;
- tree[v].setmax=0;
- tree[v].add=x;
- push(v,l,r);
- return;
- }
- int m=(l+r)/2;
- if(r0<=m)uadd(2*v,l,m,l0,r0,x),push(2*v+1,m+1,r);
- else if(l0>m)uadd(2*v+1,m+1,r,l0,r0,x),push(2*v,l,m);
- else uadd(2*v,l,m,l0,m,x),uadd(2*v+1,m+1,r,m+1,r0,x);
- }
- ll get(int v,int l,int r,int pos){
- push(v,l,r);
- if(l==r)return tree[v].val;
- int m=(l+r)/2;
- if(pos<=m)return get(2*v,l,m,pos);
- return get(2*v+1,m+1,r,pos);
- }
- std::vector<int> distribute_candies(std::vector<int> c, std::vector<int> l,
- std::vector<int> r, std::vector<int> v){
- for(auto&[val,set0,setmax,add]:tree){
- val=set0=setmax=add=0;
- }
- int n=c.size();int q=l.size();
- vector<pair<int,int>>vec;
- for(int i=0;i<n;i++)vec.push_back({c[i],i});
- sort(vec.begin(),vec.end());
- for(int i=0;i<n;i++)C.push_back(vec[i].first);
- for(int i=0;i<q;i++){
- int L=-1;int R=n;
- if(v[i]>0){
- while(R>L+1){
- int m=(L+R)/2;
- if(get(1,0,n-1,m)+v[i]>=C[m])L=m;
- else R=m;
- }
- if(L!=-1)usetmax(1,0,n-1,0,L);
- if(R!=n)uadd(1,0,n-1,R,n-1,v[i]);
- }else{
- while(R>L+1){
- int m=(L+R)/2;
- if(get(1,0,n-1,m)+v[i]<=0)L=m;
- else R=m;
- }
- if(L!=-1)uset0(1,0,n-1,0,L);
- if(R!=n)uadd(1,0,n-1,R,n-1,v[i]);
- }
- }
- vector<int>ans(n);
- for(int i=0;i<n;i++){
- ans[vec[i].second]=get(1,0,n-1,i);
- }
- return ans;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement