#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
 
#define F first
#define S second
#define endl '\n'
#define Mp make_pair
#define pb push_back
#define pf push_front
#define size(x) (ll)x.size()
#define all(x) x.begin(), x.end()
#define fuck(x) cout<<"("<<#x<<" : "<<x<<")\n"
 
const int N = 3e5 + 100, lg = 18;
const ll Mod = 1e9 + 7;
const ll inf = 1e18 + 10;
 
ll MOD(ll a, ll mod=Mod) {
    a%=mod; (a<0)&&(a+=mod); return a;
}
ll poww(ll a, ll b, ll mod=Mod) {
    ll res = 1;
    while(b > 0) {
        if(b%2 == 1) res = MOD(res * a, mod);
        b /= 2;
        a = MOD(a * a, mod);
    }
    return res;
}
struct Node {
    ll mn, mx, sum;
    Node() {
        mn = mx = sum = 0;
    }
} seg[2*N];
Node merge(Node a, Node b) {
    a.mn = min(a.mn, a.sum + b.mn);
    a.mx = max(a.mx, a.sum + b.mx);
    a.sum += b.sum;
    return a;
}
 
ll t, n, q, c[N];
vector<pll> Q[N];
void update(int ind, ll x) {
    seg[ind].sum += x;
    seg[ind].mn = min(0ll, seg[ind].sum);
    seg[ind].mx = max(0ll, seg[ind].sum);
    ind /= 2;
    while(ind > 0) {
        seg[ind] = merge(seg[2*ind], seg[2*ind + 1]); ind /= 2;
    }
}
Node query(int l, int r, int ind=1, int lc=1, int rc=(1<<lg)+1) {
    if(l >= rc || lc >= r) return Node();
    if(lc >= l && rc <= r) return seg[ind];
    int mid = (lc + rc) / 2;
    return merge(query(l, r, 2*ind, lc, mid), query(l, r, 2*ind+1, mid, rc));
}
vector<int> distribute_candies(vector<int> _c, vector<int> _l, vector<int> _r, vector<int> _v) {
    n = size(_c), q = size(_l);
    for(int i=1; i<=n; i++) {
        c[i] = _c[i - 1];
    }
    for(int i=1; i<=q; i++) {
        Q[_l[i-1] + 1].pb({i, _v[i - 1]});
        Q[_r[i-1] + 2].pb({i, -_v[i - 1]});
        
    }
    vector<int> ans;
    for(int i=1; i<=n; i++) {
        for(auto it : Q[i]) {
            update(it.F + (1<<lg) - 1, it.S);
        }
        int l=0, r=q+1;
        while(r - l > 1) {
            int mid = (l + r) / 2;
            Node res = query(mid, q + 1);
            if(res.mx - res.mn >= c[i]) {
                l = mid;
            } else {
                r = mid;
            }
        }
        Node n2 = query(l + 1, q + 1);
        // fuck(i);
        // fuck(r);
        if(seg[1].mx - seg[1].mn < c[i]) {
            ans.pb(seg[1].sum);
        } else if(_v[l - 1] < 0) {
            ans.pb(n2.sum);
        } else {
            ans.pb(c[i] + n2.sum);
            // fuck(n2.sum);
        }
    }
    return ans;
}
| # | 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... |