#include "bits/stdc++.h"
#include "candies.h"
using namespace std;
using ll = long long;
const ll inf = 1e16;
const int N = 4e5 + 10;
struct node {
ll mn, mx, posmn, posmx;
};
node neutral = {inf, -inf, -1, -1};
node t[4 * N];
ll lazy[4 * N];
void push(int i, int l, int r) {
if(!lazy[i]) return;
t[i].mn += lazy[i];
t[i].mx += lazy[i];
if(l != r) {
lazy[2 * i] += lazy[i];
lazy[2 * i + 1] += lazy[i];
}
lazy[i] = 0;
}
node merge(node a, node b) {
if(a.mn == -1) return b;
if(b.mn == -1) return a;
node c;
c.mn = min(a.mn, b.mn);
c.mx = max(a.mx, b.mx);
c.posmn = (a.mn < b.mn ? a.posmn : b.posmn);
c.posmx = (a.mx > b.mx ? a.posmx : b.posmx);
return c;
}
void modif(int i, int l, int r, int tl, int tr, ll val) {
push(i, l, r);
if(l > tr || r < tl) return;
if(l >= tl && r <= tr) {
lazy[i] += val;
push(i, l, r);
return;
}
int mid = l + r >> 1;
modif(2 * i, l, mid, tl, tr, val);
modif(2 * i + 1, mid + 1, r, tl, tr, val);
t[i] = merge(t[2 * i], t[2 * i + 1]);
}
node query(int i, int l, int r, int tl, int tr) {
push(i, l, r);
if(l > tr || r < tl) return neutral;
if(l >= tl && r <= tr) return t[i];
int mid = l + r >> 1;
return merge(query(2 * i, l, mid, tl, tr), query(2 * i + 1, mid + 1, r, tl, tr));
}
void build(int i, int l, int r) {
if(l > r) return;
if(l == r) {
t[i].mx = t[i].mn = 0;
t[i].posmn = t[i].posmx = l;
lazy[i] = 0;
return;
}
int mid = l + r >> 1;
build(2 * i, l, mid);
build(2 * i + 1, mid + 1, r);
t[i] = merge(t[2 * i], t[2 * i + 1]);
}
std::vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) {
int n = c.size(), q = l.size();
build(1, 0, q);
vector<ll> a(n, 0);
vector<vector<int>> st(n + 1), en(n + 1);
for(int i = 0; i < q; ++i) {
st[l[i]].push_back(i);
en[r[i] + 1].push_back(i);
}
for(int i = 0; i < n; ++i) {
for(auto j: en[i]) {
modif(1, 0, q, j + 1, q, -v[j]);
}
for(auto j: st[i]) {
modif(1, 0, q, j + 1, q, v[j]);
}
int l = 0, r = q - 1, pos = -1;
while(l <= r) {
int mid = l + r >> 1;
node x = query(1, 0, q, mid, q);
if(x.mx - x.mn >= c[i]) {
pos = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
if(pos != -1) {
node x = query(1, 0, q, pos, q);
if(x.posmx < x.posmn) {
a[i] = 0;
} else {
a[i] = c[i];
}
int j = max(x.posmn, x.posmx);
if(j + 1 <= q) {
node x = query(1, 0, q, j + 1, q);
ll MN = x.mn - query(1, 0, q, j, j).mn;
ll MX = x.mx - query(1, 0, q, j, j).mn;
assert(MN >= -c[i] + 1);
assert(MX < c[i];)
if(!a[i] && MN < 0) a[i] -= MN;
else if(a[i] == c[i] && MX > 0) a[i] -= MX;
a[i] += query(1, 0, q, q, q).mx - query(1, 0, q, j, j).mx;
//assert(a[i] >= 0 && a[i] <= c[i]);
}
} else {
node x = query(1, 0, q, q, q);
a[i] = x.mx;
x = query(1, 0, q, 0, q);
if(x.mn < 0) a[i] -= x.mn;
assert(a[i] >= 0 && a[i] <= c[i]);
}
}
vector<int> cc(n);
for(int i = 0; i < n; ++i) cc[i] = a[i];
return cc;
}
/*
3
10 15 13
2
0 2 20
0 1 -11
*/
Compilation message
candies.cpp: In function 'void modif(int, int, int, int, int, ll)':
candies.cpp:46:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
46 | int mid = l + r >> 1;
| ~~^~~
candies.cpp: In function 'node query(int, int, int, int, int)':
candies.cpp:55:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
55 | int mid = l + r >> 1;
| ~~^~~
candies.cpp: In function 'void build(int, int, int)':
candies.cpp:66:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
66 | int mid = l + r >> 1;
| ~~^~~
candies.cpp: In function 'std::vector<int> distribute_candies(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
candies.cpp:91:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
91 | int mid = l + r >> 1;
| ~~^~~
In file included from /usr/include/c++/10/cassert:44,
from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
from candies.cpp:1:
candies.cpp:113:33: error: expected ')' before ';' token
113 | assert(MX < c[i];)
| ^
candies.cpp:113:33: error: expected ')' before ';' token
candies.cpp:113:17: note: to match this '('
113 | assert(MX < c[i];)
| ^~~~~~
candies.cpp:113:17: error: expected primary-expression before ')' token
113 | assert(MX < c[i];)
| ^~~~~~
candies.cpp:115:17: error: expected '}' before 'else'
115 | else if(a[i] == c[i] && MX > 0) a[i] -= MX;
| ^~~~
candies.cpp:108:28: note: to match this '{'
108 | if(j + 1 <= q) {
| ^
candies.cpp:115:41: error: 'MX' was not declared in this scope
115 | else if(a[i] == c[i] && MX > 0) a[i] -= MX;
| ^~
candies.cpp:120:11: error: 'else' without a previous 'if'
120 | } else {
| ^~~~
candies.cpp:122:15: error: 'i' was not declared in this scope
122 | a[i] = x.mx;
| ^
candies.cpp: At global scope:
candies.cpp:128:20: error: 'n' was not declared in this scope
128 | vector<int> cc(n);
| ^
candies.cpp:129:5: error: expected unqualified-id before 'for'
129 | for(int i = 0; i < n; ++i) cc[i] = a[i];
| ^~~
candies.cpp:129:20: error: 'i' does not name a type
129 | for(int i = 0; i < n; ++i) cc[i] = a[i];
| ^
candies.cpp:129:27: error: expected unqualified-id before '++' token
129 | for(int i = 0; i < n; ++i) cc[i] = a[i];
| ^~
candies.cpp:130:5: error: expected unqualified-id before 'return'
130 | return cc;
| ^~~~~~
candies.cpp:131:1: error: expected declaration before '}' token
131 | }
| ^
candies.cpp: In function 'std::vector<int> distribute_candies(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
candies.cpp:75:22: warning: control reaches end of non-void function [-Wreturn-type]
75 | vector<ll> a(n, 0);
| ^