Submission
Status:
[PPPPPPPP][PPPPPPPP][PPPPPPPPP]
Score: 100
User: 998244353
Problemset: 06.Happiness
Language: cpp
Time: 0.106 second
Submitted On: 2025-03-31 14:23:40
/*******************
* what the sigma *
********************/
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <algorithm>
#include <stack>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set(x) tree<x, null_type, less<x>, rb_tree_tag, tree_order_statistics_node_update>
using namespace std;
#define lgm cin.tie(0)->sync_with_stdio(0);
#define be(x) x.begin(),x.end()
#define ve vector
#define ll long long
#define ld long double
bool enabledb=0;
#define DB(CODE) cout<<'\t'<<CODE<<endl;
#define SP <<' '<<
#define ull unsigned ll
#define f first
#define s second
#define pii pair<int, int>
#define tii tuple<int,int,int>
#define pll pair<ll,ll>
#define sz(x) (int)x.size()
#define pb push_back
const ll mod = 1e9+7,maxn=200005;
const ll INF=(ll)9e18;
ll seg[maxn*4],laz[maxn*4];
int a[maxn];
void build(int u,int l,int r) {
if (l==r) {
seg[u]=a[l];
return;
}
int mid=(l+r)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
seg[u]=min(seg[u<<1],seg[u<<1|1]);
}
void push(int u,int l,int r) {
if (l<r) {
seg[u<<1]+=laz[u];
seg[u<<1|1]+=laz[u];
laz[u<<1]+=laz[u];
laz[u<<1|1]+=laz[u];
}
laz[u]=0;
}
void upd(int u,int l,int r,int tl,int tr,int v) {
if (l>tr||r<tl) return;
if (l>=tl&&r<=tr) {
seg[u]+=v;
laz[u]+=v;
return;
}
push(u,l,r);
int mid=(l+r)>>1;
upd(u<<1,l,mid,tl,tr,v);
upd(u<<1|1,mid+1,r,tl,tr,v);
seg[u]=min(seg[u<<1],seg[u<<1|1]);
}
ll query(int u,int l,int r,int tl,int tr) {
if (l>tr||r<tl) return 1e9;
if (l>=tl&&r<=tr) {
return seg[u];
}
push(u,l,r);
int mid=(l+r)>>1;
return min(query(u<<1,l,mid,tl,tr),query(u<<1|1,mid+1,r,tl,tr));
}
signed main() {
lgm;
int n;
cin >> n;
ve<pii> d;
int c=0;
for (int i=1;i<=n;i++) {
cin >> a[i];
if (a[i]>=0) {
upd(1,1,n,i,n,a[i]);
c++;
} else {
d.pb({a[i],i});
}
}
sort(be(d),greater<pii>());
for (auto [v,i]:d) {
if (query(1,1,n,i,n)>=-v) upd(1,1,n,i,n,v),c++;
}
cout << c;
}