Submission #537707

#TimeUsernameProblemLanguageResultExecution timeMemory
537707cig32Hedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
0 / 100
3054 ms40104 KiB
#include "bits/stdc++.h" using namespace std; const int MAXN = 2e5 + 10; const int MOD = 1e9 + 7; //#define int long long mt19937_64 rng((int)std::chrono::steady_clock::now().time_since_epoch().count()); int rnd(int x, int y) { int u = uniform_int_distribution<int>(x, y)(rng); return u; } long long bm(long long b, long long p) { if(p==0) return 1; long long r = bm(b, p/2); if(p&1) return (((r*r) % MOD) * b) % MOD; return (r*r) % MOD; } struct wavelet_tree{ #define vi vector<int> #define pb push_back int lo, hi; wavelet_tree *l, *r; vi b; //nos are in range [x,y] //array indices are [from, to) wavelet_tree(int *from, int *to, int x, int y){ lo = x, hi = y; if(lo == hi or from >= to) return; int mid = (lo+hi)/2; auto f = [mid](int x){ return x <= mid; }; b.reserve(to-from+1); b.pb(0); for(auto it = from; it != to; it++) b.pb(b.back() + f(*it)); //see how lambda function is used here auto pivot = stable_partition(from, to, f); l = new wavelet_tree(from, pivot, lo, mid); r = new wavelet_tree(pivot, to, mid+1, hi); } //kth smallest element in [l, r] int kth(int l, int r, int k){ if(l > r) return 0; if(lo == hi) return lo; int inLeft = b[r] - b[l-1]; int lb = b[l-1]; //amt of nos in first (l-1) nos that go in left int rb = b[r]; //amt of nos in first (r) nos that go in left if(k <= inLeft) return this->l->kth(lb+1, rb , k); return this->r->kth(l-lb, r-rb, k-inLeft); } //count of nos in [l, r] Less than or equal to k int LTE(int l, int r, int k) { if(l > r or k < lo) return 0; if(hi <= k) return r - l + 1; int lb = b[l-1], rb = b[r]; return this->l->LTE(lb+1, rb, k) + this->r->LTE(l-lb, r-rb, k); } //count of nos in [l, r] equal to k int count(int l, int r, int k) { if(l > r or k < lo or k > hi) return 0; if(lo == hi) return r - l + 1; int lb = b[l-1], rb = b[r], mid = (lo+hi)/2; if(k <= mid) return this->l->count(lb+1, rb, k); return this->r->count(l-lb, r-rb, k); } //count max element in [l, r] stricly smaller than k int upper_bound(int l, int r, int k) { if(l > r) return -1; int uwu = LTE(l, r, k - 1); if(uwu == 0) return -1; return kth(l, r, uwu); } ~wavelet_tree(){ delete l; delete r; } }; int st[20][MAXN]; int query_max(int l, int r) { int k = 32 - __builtin_clz(r-l+1) - 1; return max(st[k][l], st[k][r-(1<<k)+1]); } int ans[20][MAXN]; int a[MAXN]; int upper_bound(int l, int r, int v) { if(l > r) return -1; int ans = 0; for(int i=l; i<=r; i++) { if(a[i] < v) ans = max(ans, a[i]); } return ans; } void solve(int tc) { int n, m; cin >> n >> m; for(int i=1; i<=n; i++) { cin >> a[i]; st[0][i] = a[i]; } // wavelet_tree T(a+1, a+n+1, 0, 1000000000); for(int i=1; i<20; i++) { for(int j=1; j<=n; j++) { if(j+(1<<i)-1 <= n) { st[i][j] = max(st[i-1][j], st[i-1][j+(1<<(i-1))]); } } } for(int i=1; i<=n; i++) { ans[0][i] = -1; } for(int i=1; i<20; i++) { for(int j=1; j<=n; j++) { if(j+(1<<i)-1 <= n) { ans[i][j] = max(ans[i-1][j], ans[i-1][j+(1<<(i-1))]); int q1 = query_max(j, j+(1<<(i-1))-1); int q2 = upper_bound(j + (1<<(i-1)), j + (1<<i) - 1, q1); if(q1 > q2 && q2 != -1) ans[i][j] = max(ans[i][j], q1 + q2); } } } while(m--) { int l, r, s; cin >> l >> r >> s; if(l == r) { cout << "1\n"; continue; } int k = 32 - __builtin_clz(r-l+1) - 1; int res = max(ans[k][l], ans[k][r-(1<<k)+1]); int q1 = query_max(l, l + (1<<k) - 1); int q2 = upper_bound(l + (1<<k), r, q1); if(q1 > q2 && q2 != -1) res = max(res, q1 + q2); cout << (res > s ? "0\n" : "1\n"); } } int32_t main(){ ios::sync_with_stdio(0); cin.tie(0); int t = 1; //cin >> t; for(int i=1; i<=t; i++) solve(i); } /* 7 1 4 9 1 0 4 0 8 4 7 4 */
#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...