#include "candies.h"
#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define ff first
#define ss second
const int inf = 1e18;
using namespace std;
struct node{
int pref = 0,sub= 0,sum= 0,suf=0,mxp =0;
node operator+(node b)
{
node res;
res.sum = sum+b.sum;
res.pref = min(pref,b.pref+sum);
res.suf = min(b.suf,suf+b.sum);
res.mxp=max(mxp,b.mxp+sum);
res.sub = min({sub,b.sub,suf+b.pref});
return res;
}
};
struct seggy{
int n;
vector<node> t;
seggy(int sz){
n = sz;
t.resize(2*n,node());
}
void update(int i,int x)
{
node&a = t[i+=n];
a.sum = x;
a.pref=min(x,0ll);
a.suf = a.pref;
a.sub = min(0ll,x);
a.mxp = max(0ll,x);
for(;i>1;i/=2)
t[i/2]=t[i]+t[i^1];
}
node query(int l,int r)
{
r++;
if(l>r)
return node();
node res;
for(l+=n,r+=n;l<r;l/=2,r/=2)
{
if(l&1)
res = res+t[l++];
if(r&1)
res = res+t[--r];
}
return res;
}
};
vector<signed> distribute_candies(vector<signed> c, vector<signed> l,
vector<signed> r, vector<signed> v) {
int n = c.size();
int q= l.size();
vector<vector<pii>> add(n),rem(n);
for(int i = 0;i <q;i++)
{
add[l[i]].push_back({i,v[i]});
rem[r[i]].push_back({i,v[i]});
}
seggy mile(n);
vector<signed> ans(n);
for(int i = 0; i < n; i++)
{
for(pii x:add[i])
mile.update(x.ff,x.ss);
int idx = -1;
{
int l = -1,r = n-1;
while(r-l)
{
int mid = l+r+1>>1;
if(-mile.query(mid,n-1).sub > c[i])
l = mid;
else
r = mid-1;
}
idx = l;
}
node g = mile.query(idx+1,n-1);
int lit = -min(0ll,c[i]+g.pref);
int big = max(0ll,g.mxp+lit-c[i]);
ans[i] = g.sum-big+lit;
for(pii x:rem[i])
mile.update(x.ff,0);
}
return ans;
}
#undef int
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |