Submission #767542

#TimeUsernameProblemLanguageResultExecution timeMemory
767542NintsiChkhaidzeGrowing Trees (BOI11_grow)C++17
100 / 100
129 ms9036 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); 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); } 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 (t[h].mx < H) return r + 1; 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 (t[h].mn > H) return l - 1; 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); if (l > r) cout<<0<<endl; else cout<<r - l + 1<<"\n"; }else{ int x,h; cin>>x>>h; int l = find(1,1,n,h),r = min(n,l + x - 1); if (t[1].mx < h) continue; int val = get(1,1,n,r); int l1 = findlast(1,1,n,val - 1); upd(1,1,n,l,l1,1); x -= (l1 - l + 1); int rr = findlast(1,1,n,val); upd(1,1,n,max(l1 + 1,rr - x + 1),rr,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...