This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include "happiness.h"
using namespace std;
using ll = long long;
ll MAXV = 1000000000000LL;
const int MAXC = 10000000;
multiset <ll> brojevi;
int idxx;
struct Segment{
int L, R;
ll lazy;
ll mx;
} seg[MAXC];
int cnode(ll r){
++idxx;
seg[idxx].mx = r;
return idxx;
}
void propagate(int node, ll l, ll r){
seg[node].mx += seg[node].lazy;
if(l == r){
seg[node].lazy = 0;
return;
}
ll mid = (l+r)/2;
if(!seg[node].L) seg[node].L = cnode(mid);
if(!seg[node].R) seg[node].R = cnode(r);
seg[seg[node].L].lazy += seg[node].lazy;
seg[seg[node].R].lazy += seg[node].lazy;
seg[node].lazy = 0;
}
void upd(int node, ll l, ll r, ll tl, ll tr, ll val){
propagate(node, l, r);
if(tl > r || l > tr) return;
if(tl <= l && r <= tr){
seg[node].lazy += val;
propagate(node, l, r);
return;
}
ll mid = (l+r)/2;
if(!seg[node].L) seg[node].L = cnode(mid);
if(!seg[node].R) seg[node].R = cnode(r);
upd(seg[node].L, l, mid, tl, tr, val);
upd(seg[node].R, mid+1, r, tl, tr, val);
seg[node].mx = max(seg[seg[node].L].mx, seg[seg[node].R].mx);
}
ll query(int node, ll l, ll r, ll tl, ll tr){
propagate(node, l, r);
if(tl > r || l > tr) return 0;
if(tl <= l && r <= tr){
return seg[node].mx;
}
ll mid = (l+r)/2;
if(!seg[node].L) seg[node].L = cnode(mid);
if(!seg[node].R) seg[node].R = cnode(r);
return max(query(seg[node].L, l, mid, tl, tr), query(seg[node].R, mid+1, r, tl, tr));
}
bool init(int coinsCount, long long maxCoinSize, long long coins[]) {
MAXV = maxCoinSize+5;
idxx = 1;
for(int i=0; i<coinsCount; i++){
upd(1, 1, MAXV, coins[i]+1, MAXV, -coins[i]);
brojevi.insert(coins[i]);
}
if(brojevi.empty()) return 1;
ll largest = *brojevi.rbegin();
return query(1, 1, MAXV, 1, largest) <= 1;
}
bool is_happy(int event, int coinsCount, long long coins[]) {
for(int i=0; i<coinsCount; i++){
if(event == 1){
upd(1, 1, MAXV, coins[i]+1, MAXV, -coins[i]);
brojevi.insert(coins[i]);
}
else{
upd(1, 1, MAXV, coins[i]+1, MAXV, coins[i]);
brojevi.erase(brojevi.find(coins[i]));
}
}
if(brojevi.empty()) return 1;
ll largest = *brojevi.rbegin();
return query(1, 1, MAXV, 1, largest) <= 1;
}
/*
5 100
4 8 1 2 16
2
-1 2 2 8
1 3 7 9 2
*/
Compilation message (stderr)
grader.cpp: In function 'int main()':
grader.cpp:16:12: warning: unused variable 'max_code' [-Wunused-variable]
16 | long long max_code;
| ^~~~~~~~
# | 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... |