Submission #537745

#TimeUsernameProblemLanguageResultExecution timeMemory
537745cig32Hedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
0 / 100
337 ms262144 KiB
#include "bits/stdc++.h" using namespace std; const int MAXN = 1e6 + 10; const int MOD = 1e9 + 7; 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; } int a[MAXN]; struct wavelet_tree { int lo, hi; wavelet_tree *l, *r; int *b, *c, bsz, csz; // c holds the prefix sum of elements wavelet_tree() { lo = 1; hi = 0; bsz = 0; csz = 0, l = NULL; r = NULL; } void init(int *from, int *to, int x, int y) { lo = x, hi = y; if(from >= to) return; int mid = (lo + hi) >> 1; auto f = [mid](int x) { return x <= mid; }; b = (int*)malloc((to - from + 2) * sizeof(int)); bsz = 0; b[bsz++] = 0; c = (int*)malloc((to - from + 2) * sizeof(int)); csz = 0; c[csz++] = 0; for(auto it = from; it != to; it++) { b[bsz] = (b[bsz - 1] + f(*it)); c[csz] = (c[csz - 1] + (*it)); bsz++; csz++; } if(hi == lo) return; auto pivot = stable_partition(from, to, f); l = new wavelet_tree(); l->init(from, pivot, lo, mid); r = new wavelet_tree(); r->init(pivot, to, mid + 1, hi); } //kth smallest element in [l, r] //for array [1,2,1,3,5] 2nd smallest is 1 and 3rd smallest is 2 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], lb = b[l - 1], rb = b[r]; if(k <= inLeft) return this->l->kth(lb + 1, rb, k); return this->r->kth(l - lb, r - rb, k - inLeft); } //count of numbers in [l, r] Less than or equal to k int LTE(int l, int r, int k) { if(l > r || 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 numbers in [l, r] equal to k int count(int l, int r, int k) { if(l > r || k < lo || k > hi) return 0; if(lo == hi) return r - l + 1; int lb = b[l - 1], rb = b[r]; int mid = (lo + hi) >> 1; if(k <= mid) return this->l->count(lb + 1, rb, k); return this->r->count(l - lb, r - rb, k); } //sum of numbers in [l ,r] less than or equal to k int sum(int l, int r, int k) { if(l > r or k < lo) return 0; if(hi <= k) return c[r] - c[l - 1]; int lb = b[l - 1], rb = b[r]; return this->l->sum(lb + 1, rb, k) + this->r->sum(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]; void solve(int tc) { int n, m; n = 1000000, m = 1000000; //cin >> n >> m; for(int i=1; i<=n; i++) { a[i] = rnd(0, 1000000); //cin >> a[i]; st[0][i] = a[i]; } wavelet_tree T; T.init(a+1, a+n+1, 0, 1000000); 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 = T.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); } } } return; 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 = T.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); }
#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...