#include "candies.h"
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
const int MAXN = 2e5+5;
const ll INF = 1e15;
int N, Q;
vector <pii> ch[MAXN];
struct segment {
int L, R;
pii val;
ll lz;
segment *lef, *rig;
segment(int x,int y) {
L = x; R = y;
val.fi = val.se = lz = 0;
if (L == R) {
return;
}
int mid=(L+R)/2;
lef = new segment(L,mid);
rig = new segment(mid+1,R);
}
pii add(pii x,pii y) {
return {min(x.fi,y.fi),max(x.se,y.se)};
}
void push() {
if (lz) {
lef->lz += lz;
lef->val.fi += lz;
lef->val.se += lz;
rig->lz += lz;
rig->val.fi += lz;
rig->val.se += lz;
lz = 0;
}
}
pii query(int x,int y) {
if (x <= L && y >= R) {
return val;
}
if (x > R || y < L) {
return {INF,-INF};
}
push();
return add(lef->query(x,y),rig->query(x,y));
}
void update(int x,int y,int z) {
if (x <= L && y >= R) {
lz += z;
val.fi += z;
val.se += z;
return;
}
if (x > R || y < L) {
return;
}
push();
lef->update(x,y,z);
rig->update(x,y,z);
val = add(lef->val,rig->val);
}
};
vector<int> distribute_candies(vector<int> c,vector<int> l,vector<int> r,vector<int> v) {
N = c.size();
Q = v.size();
for (int i=0;i<Q;i++) {
ch[l[i]].push_back({i+1,v[i]});
ch[r[i]+1].push_back({i+1,-v[i]});
}
segment tree = segment(0,Q);
vector <int> s(N);
for (int i=0;i<N;i++) {
for (pii x : ch[i]) {
tree.update(x.fi,Q,x.se);
}
int L = 0, R = Q, res = -1;
while (L <= R) {
int mid = (L+R)/2;
pii temp = tree.query(mid,Q);
if (temp.se - temp.fi > c[i]) {
res = mid;
L = mid+1;
}
else {
R = mid-1;
}
}
ll start = tree.query(res,res).fi;
ll last = tree.query(Q,Q).fi;
pii val = tree.query(res,Q);
if (start == val.fi) {
s[i] = c[i] - val.se + last;
}
else {
s[i] = last - val.fi;
}
}
return s;
}
# | 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... |