제출 #1191484

#제출 시각아이디문제언어결과실행 시간메모리
1191484kl0989eEditor (BOI15_edi)C++20
100 / 100
232 ms84776 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define fi first #define se second #define pb push_back #define vi vector<int> #define vl vector<ll> #define pi pair<int, int> #define pl pair<ll,ll> #define all(x) (x).begin(),(x).end() struct segTree { struct node { int mx=-1; node() {}; node(int _mx): mx(_mx) {} }; node unite(node a, node b) { return {max(a.mx,b.mx)}; } int newnode() { nodes.pb(node()); l.pb(0); r.pb(0); return nodes.size()-1; } int n; vector<node> nodes; vi l,r; segTree(int _n): n(_n) {} void build(vl& a, int v, int tl, int tr) { if (tl==tr) { nodes[v]=a[tl]; } else { int tm=tl+(tr-tl)/2; l[v]=newnode(); r[v]=newnode(); build(a,l[v],tl,tm); build(a,r[v],tm+1,tr); nodes[v]=unite(nodes[l[v]],nodes[r[v]]); } } int build(vl& a) { int v=newnode(); build(a,v,0,n-1); return v; } void update(int pos, ll new_val, int v, int tl, int tr, int prev) { if (tl==tr) { nodes[v]=new_val; } else { int tm=tl+(tr-tl)/2; if (pos<=tm) { l[v]=newnode(); r[v]=r[prev]; update(pos,new_val,l[v],tl,tm,l[prev]); } else { l[v]=l[prev]; r[v]=newnode(); update(pos,new_val,r[v],tm+1,tr,r[prev]); } nodes[v]=unite(nodes[l[v]],nodes[r[v]]); } } int update(int pos, ll new_val, int prev) { int v=newnode(); update(pos,new_val,v,0,n-1,prev); return v; } node get(int ql, int qr, int v, int tl, int tr) { if (ql<=tl && tr<=qr) { return nodes[v]; } if (tr<ql || qr<tl) { return node(); } int tm=tl+(tr-tl)/2; return unite(get(ql,qr,l[v],tl,tm),get(ql,qr,r[v],tm+1,tr)); } node get(int l, int r, int rt) { return get(l,r,rt,0,n-1); } }; int32_t main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; vi ans(n+1,0); segTree data(n+1); vi roots(n+1); vl t(n+1,-1); roots[0]=data.build(t); int a; for (int i=0; i<n; i++) { cin >> a; if (a>0) { roots[i+1]=data.update(0,i+1,roots[i]); ans[i+1]=a; } else { int t=data.get(0,-a-1,roots[i]).mx-1; roots[i+1]=data.update(-a,i+1,roots[t]); ans[i+1]=ans[t]; } cout << ans[i+1] << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...