Submission #562794

#TimeUsernameProblemLanguageResultExecution timeMemory
562794StickfishHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
77 / 100
3042 ms164328 KiB
#include <iostream> #include <vector> using namespace std; using ll = long long; const ll INF = 1e9 + 177013; const int MAXN = 1e6 + 123; int w[MAXN]; int pv[MAXN]; int get_max(int l, int r) { int mx = -INF; int ans = 0; for (int i = l; i < r; ++i) { if (mx > w[i]) ans = max(ans, mx + w[i]); else mx = w[i]; } return ans; } void merg_add(vector<pair<int, int>>& a, pair<int, int> vl) { while (a.size() && a.back().second <= vl.second) { a.pop_back(); } a.push_back(vl); } vector<pair<int, int>> merg(vector<pair<int, int>> a, vector<pair<int, int>> b) { vector<pair<int, int>> ans; int n = a.size(); int m = b.size(); int j = 0; for (int i = 0; i < n; ++i) { while (j < m && b[j] < a[i]) { merg_add(ans, b[j]); ++j; } merg_add(ans, a[i]); } while (j < m) { merg_add(ans, b[j]); ++j; } return ans; } struct stree { void resize(int n) { sz = n; t.resize(sz * 2 - 1); init(0, 0, sz); } int get(int l, int r) { return get(0, 0, sz, l, r); } private: int sz; vector<vector<pair<int, int>>> t; void init(int ind, int lnd, int rnd) { if (rnd - lnd == 1) { if (pv[lnd] >= 0) t[ind] = {{pv[lnd], w[lnd] + w[pv[lnd]]}}; } else { int mnd = (lnd + rnd) / 2; int chd = ind + (mnd - lnd) * 2; init(ind + 1, lnd, mnd); init(chd, mnd, rnd); t[ind] = merg(t[ind + 1], t[chd]); } } int get(int ind, int lnd, int rnd, int l, int r) { int mnd = (lnd + rnd) / 2; int chd = ind + (mnd - lnd) * 2; if (lnd >= l && rnd <= r) { int i = lower_bound(t[ind].begin(), t[ind].end(), pair<int, int>(l, -1)) - t[ind].begin(); if (i == t[ind].size()) return 0; return t[ind][i].second; } if (lnd >= r || rnd <= l) return 0; return max(get(ind + 1, lnd, mnd, l, r), get(chd, mnd, rnd, l, r)); } }; signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, m; cin >> n >> m; for (int i = 0; i < n; ++i) cin >> w[i]; vector<pair<int, int>> previnit = {{INF, -1}}; for (int i = 0; i < n; ++i) { while (previnit.back().first <= w[i]) { previnit.pop_back(); } pv[i] = previnit.back().second; previnit.push_back({w[i], i}); } stree tr; tr.resize(n); for (int i = 0; i < m; ++i) { int l, r, k; cin >> l >> r >> k; --l; if (tr.get(l, r) > k) { cout << 0 << '\n'; } else { cout << 1 << '\n'; } } }

Compilation message (stderr)

sortbooks.cpp: In member function 'int stree::get(int, int, int, int, int)':
sortbooks.cpp:82:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |              if (i == t[ind].size())
      |                  ~~^~~~~~~~~~~~~~~~
#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...