#include "candies.h"
#include <vector>
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
pair<ll, ll> segm[800005];
ll laz[800005];
bool vis[200005];
vector<pair<int, int>> upds[200005];
void push(int node, bool isleave) {
segm[node].first += laz[node];
segm[node].second += laz[node];
if(!isleave) {
laz[node*2+1] += laz[node];
laz[node*2+2] += laz[node];
}
laz[node] = 0;
}
void upd(int idx, int l, int r, int tl, int tr, ll val) {
push(idx, l==r);
if(r < tl || tr < l) return ;
if(tl <= l && r <= tr) {
laz[idx] += val;
push(idx, l == r);
return;
}
int mid = (l+r) >> 1;
upd(idx*2+1, l, mid, tl, tr, val);
upd(idx*2+2, mid+1, r, tl, tr, val);
segm[idx].first = min(segm[idx*2+1].first, segm[idx*2+2].first);
segm[idx].second = max(segm[idx*2+1].second, segm[idx*2+2].second);
}
pair<ll, ll> qr(int idx, int l, int r, int tl, int tr) {
push(idx, l == r);
if(r < tl || tr < l) return {LLONG_MAX, LLONG_MIN};
if(tl <= l && r <= tr) return segm[idx];
int mid = (l+r) >> 1;
auto i1 = qr(idx*2+1, l, mid, tl, tr), i2 = qr(idx*2+2, mid+1, r, tl, tr);
return {min(i1.first, i2.first), max(i1.second, i2.second)};
}
std::vector<int> distribute_candies(std::vector<int> c, std::vector<int> l, std::vector<int> r, std::vector<int> v) {
int n = c.size(), q = l.size();
std::vector<int> s(n);
//vector<tuple<int, int, int>> eves;
for(int i=1;i<=q;i++) {
upds[l[i-1]].emplace_back(i, v[i-1]);
upds[r[i-1]+1].emplace_back(i, v[i-1]);
}
set<pair<int, int>> tms;
tms.emplace(0, 0);
for(int i=0;i<n;i++) {
for(auto &e:upds[i]) {
if(vis[e.first]) {
upd(0, 0, q, e.first, q, -e.second);
if(e.second > 0) tms.erase({e.first, 1});
else tms.erase({e.first, 0});
} else {
upd(0, 0, q, e.first, q, e.second);
if(e.second > 0) tms.emplace(e.first, 1);
else tms.emplace(e.first, 0);
}
vis[e.first] = 1;
}
int mid, l = 0, r = q;
while(l <= r) {
mid = (l+r) >> 1;
auto it = (--tms.upper_bound(make_pair(mid, 1000)))->second;
pair<ll, ll> rng;
if(it == 0) {
rng.first = qr(0, 0, q, mid, mid).first;
rng.second = rng.first + c[i];
} else {
rng.second = qr(0, 0, q, mid, mid).first;
rng.first = rng.second - c[i];
}
auto res = qr(0, 0, q, mid, q);
if(rng.first <= res.first && res.second <= rng.second) {
r = mid-1;
} else {
l = mid+1;
}
//cout << mid << '\n';
//cout << rng.first << ", " << rng.second << " what we got " << res.first << ", " << res.second << '\n';
}
//cout << l << ' ';
auto it = (--tms.upper_bound(make_pair(l, 1000)))->second;
pair<ll, ll> rng;
if(it == 0) {
rng.first = qr(0, 0, q, l, l).first;
rng.second = rng.first + c[i];
} else {
rng.second = qr(0, 0, q, l, l).first;
rng.first = rng.second - c[i];
}
auto res = qr(0, 0, q, q, q);
s[i] = res.first - rng.first;
}
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... |