Submission #767452

#TimeUsernameProblemLanguageResultExecution timeMemory
767452NintsiChkhaidzeGrowing Trees (BOI11_grow)C++17
0 / 100
108 ms7788 KiB
#include <bits/stdc++.h> #define pb push_back #define s second #define f first #define ll long long #define pii pair <int,int> #define left (h<<1),l,((l + r)>>1) #define right ((h<<1)|1),((l+r)>>1) + 1,r #define int ll // ? using namespace std; const int N = 1e5 + 5,inf = 1e9; int lz[4*N],a[N]; struct { int mx; int mn; } t[4*N]; void push(int h){ if (lz[h] == 0) return; lz[h*2] += lz[h]; lz[h*2 + 1] += lz[h]; t[h*2].mx += lz[h]; t[h*2].mn += lz[h]; t[h*2 + 1].mn += lz[h]; t[h*2 + 1].mx += lz[h]; lz[h] =0; } void build(int h,int l,int r){ if (l == r){ t[h].mn = t[h].mx = a[l]; return; } build(left); build(right); t[h].mx = max(t[h*2].mx,t[h*2 + 1].mx); t[h].mn = min(t[h*2].mn,t[h*2 + 1].mn); } int get(int h,int l,int r,int idx){ if (l == r) return t[h].mx; push(h); int mid = (l + r)/2; if (idx > mid) return get(right,idx); return get(left,idx); } void upd(int h,int l,int r,int L,int R,int val){ if (r < L || R < l) return; if (L <= l && r <= R){ t[h].mn += val; t[h].mx += val; lz[h] += val; return; } push(h); upd(left,L,R,val); upd(right,L,R,val); t[h].mx = max(t[h*2].mx,t[h*2 + 1].mx); t[h].mn = min(t[h*2].mn,t[h*2 + 1].mn); } int find(int h,int l,int r,int H){ if (l == r) return l; push(h); if (t[h*2].mx >= H) return find(left,H); return find(right,H); } int findlast(int h,int l,int r,int H){ if (l == r) return l; push(h); if (t[h*2 + 1].mn <= H) return findlast(right,H); return findlast(left,H); } signed main (){ ios_base::sync_with_stdio(0),cin.tie(NULL),cout.tie(NULL); int n,Q; cin>>n>>Q; for (int i = 1; i <= n; i++) cin>>a[i]; sort(a+1,a+n+1); build(1,1,n); while (Q--){ char c; cin>>c; if (c == 'C'){ int le,ri; cin>>le>>ri; if (t[1].mx < le || t[1].mn > ri) { cout<<0<<endl; continue; } int l = find(1,1,n,le); int r = findlast(1,1,n,ri); cout<<max(0LL,r - l + 1)<<"\n"; }else{ int x,h; cin>>x>>h; if (t[1].mx < h) continue; int l = find(1,1,n,h),r = min(n,l + x - 1); int val = get(1,1,n,r); int rr = findlast(1,1,n,val - 1); if (l <= rr){ upd(1,1,n,l,rr,1); x -= (rr - l + 1); } r = findlast(1,1,n,val); upd(1,1,n,r - x + 1,r,1); } } }
#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...