Submission #572116

#TimeUsernameProblemLanguageResultExecution timeMemory
572116vovamrHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
64 / 100
3021 ms79452 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define fi first #define se second #define ll long long #define ld long double #define sz(x) ((int)(x).size()) #define all(x) (x).begin(), (x).end() #define pb push_back #define mpp make_pair #define ve vector using namespace std; using namespace __gnu_pbds; template<class T> using oset = tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>; const ll inf = 1e18; const int iinf = 1e9; typedef pair<ll, ll> pll; typedef pair<int, int> pii; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); template <typename T> inline bool chmin(T& a, T b) { return (a > b ? a = b, 1 : 0); } template <typename T> inline bool chmax(T& a, T b) { return (a < b ? a = b, 1 : 0); } const int N = 1e6 + 100; int a[N], mx[N], ar[N]; int answer[N], hui[N]; inline void solve(int l, int r, ve<array<int,3>> &q) { if (l == r) return; int m = l + r >> 1; ve<array<int,3>> ql, qr; for (auto &qu : q) { auto &[r, l, id] = qu; if (r <= m) ql.pb(qu); else if (l > m) qr.pb(qu); } solve(l, m, ql), solve(m + 1, r, qr); mx[m + 1] = a[m + 1]; mx[m] = a[m]; ar[m] = ar[m + 1] = 0; for (int i = m + 2; i <= r; ++i) { mx[i] = max(a[i], mx[i - 1]); ar[i] = ar[i - 1]; if (mx[i - 1] > a[i]) chmax(ar[i], a[i] + mx[i - 1]); } set<int> st; st.insert(a[m]); for (int i = m - 1; i >= l; --i) { mx[i] = max(mx[i + 1], a[i]); ar[i] = ar[i + 1]; auto it = st.lower_bound(a[i]); if (it != st.begin()) chmax(ar[i], a[i] + *--it); st.insert(a[i]); } for (auto &[r, l, id] : q) { if (l <= m && r > m) { chmax(answer[id], ar[r]); chmax(answer[id], ar[l]); } } int p = 0; st.clear(); for (int i = m + 1; i <= r; ++i) { st.insert(a[i]); while (p < sz(q) && q[p][0] < i) ++p; while (p < sz(q) && q[p][0] == i) { auto &[r, l, id] = q[p]; if (l <= m && r > m) { auto it = st.lower_bound(mx[l]); if (it != st.begin()) chmax(answer[id], mx[l] + *--it); } ++p; } } } inline void solve() { int n, q; cin >> n >> q; for (int i = 0; i < n; ++i) cin >> a[i]; ve<array<int,3>> qu(q); for (int i = 0; i < q; ++i) { int l, r, k; cin >> l >> r >> k; qu[i] = {--r, --l, i}; hui[i] = k; } sort(all(qu)); solve(0, n - 1, qu); for (int i = 0; i < q; ++i) cout << (hui[i] >= answer[i] ? 1 : 0) << '\n'; } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int q = 1; // cin >> q; while (q--) solve(); cerr << fixed << setprecision(3) << "Time execution: " << (double)clock() / CLOCKS_PER_SEC << endl; }

Compilation message (stderr)

sortbooks.cpp: In function 'void solve(int, int, std::vector<std::array<int, 3> >&)':
sortbooks.cpp:30:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   30 |  int m = l + 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...