#include "candies.h"
#pragma GCC optimize("O3")
#pragma GCC target("avx2")
#include <vector>
#include <iostream>
using namespace std;
using vi = vector<int>;
#define sz(x) ((int)x.size())
#define rep(i,n) for (int i = 0; i < (n); i++)
#define repp(i,a,n) for (int i = (a); i < (n); i++)
std::vector<int> distribute_candies(std::vector<int> c, std::vector<int> l,
std::vector<int> r, std::vector<int> v) {
int orig_n = sz(c);
const int B = 4000;
int n = sz(c);
while (n%B!=0) n++;
while (sz(c) < n) c.push_back(0);
vi ans(n);
for (int b = 0; b < n; b+=B) {
rep(q, sz(v)) {
int lo = max(b, l[q]);
int hi = min(b+B, r[q]+1);
int addend = v[q];
if (v[q]>0) {
#pragma GCC ivdep
#pragma GCC unroll 8
repp(i,lo,hi) {
ans[i]+=addend;
ans[i]=min(c[i],ans[i]);
}
}
else {
#pragma GCC ivdep
#pragma GCC unroll 8
repp(i,lo,hi) {
ans[i]+=addend;
ans[i]=max(0,ans[i]);
}
}
}
}
while (sz(ans)>orig_n) ans.pop_back();
return ans;
}