Submission #1262079

#TimeUsernameProblemLanguageResultExecution timeMemory
1262079papauloGrowing Trees (BOI11_grow)C++20
100 / 100
122 ms5572 KiB
#include <bits/stdc++.h> using namespace std; #define MAXN 100100 int a[MAXN]; struct Node { int val, lazy; Node(int v) : val(v), lazy(0) {} Node() : Node(0) {} Node operator+(const Node &n) { return Node(max(this->val, n.val)); } }; Node seg[4*MAXN]; void build(int n, int l, int r) { if(l==r) seg[n]=Node(a[l-1]); else { int mid=(l+r)/2; build(2*n, l, mid); build(2*n+1, mid+1, r); seg[n]=seg[2*n]+seg[2*n+1]; } } void lazyPropagation(int n, int l, int r) { seg[n].val+=seg[n].lazy; if(l<r) { seg[2*n].lazy+=seg[n].lazy; seg[2*n+1].lazy+=seg[n].lazy; } seg[n].lazy=0; } void update(int n, int l, int r, int p, int q, int v) { if(l>q||p>r) { lazyPropagation(n, l, r); return; } if(l>=p&&r<=q) { seg[n].lazy+=v; lazyPropagation(n, l, r); return; } int mid=(l+r)/2; lazyPropagation(n, l, r); update(2*n, l, mid, p, q, v); update(2*n+1, mid+1, r, p, q, v); seg[n]=seg[2*n]+seg[2*n+1]; } int query(int n, int l, int r, int i) { lazyPropagation(n, l, r); if(l==r) return seg[n].val; int mid=(l+r)/2; if(i<=mid) return query(2*n, l, mid, i); return query(2*n+1, mid+1, r, i); } int fstidx(int n, int l, int r, int v) { lazyPropagation(n, l, r); if(seg[n].val<v) return r+1; if(l==r) return l; int mid=(l+r)/2; int lq=fstidx(2*n, l, mid, v); if(lq<=mid) return lq; return fstidx(2*n+1, mid+1, r, v); } int main() { cin.tie(nullptr); ios::sync_with_stdio(false); int n, m; cin >> n >> m; for(int i=0;i<n;i++) cin >> a[i]; sort(a, a+n); build(1, 1, n); ostringstream out; while(m--) { char op; int a, b; cin >> op >> a >> b; if(op=='F') { int l=fstidx(1, 1, n, b); if(l>n) continue; int r=min(n, l+a-1); int val=query(1, 1, n, r); int i1=fstidx(1, 1, n, val); int i2=fstidx(1, 1, n, val+1); if(i1>l) update(1, 1, n, l, i1-1, 1); int cnt=r-max(i1, l)+1; update(1, 1, n, i2-cnt, i2-1, 1); } else { int cnt=fstidx(1, 1, n, b+1)-fstidx(1, 1, n, a); out << cnt << endl; } } cout << out.str(); //for(int i=1;i<=n;i++) cout << query(1, 1, n, i) << " "; // cout << endl; 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...