Submission #330792

#TimeUsernameProblemLanguageResultExecution timeMemory
330792vitkishloh228Hedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++14
77 / 100
795 ms262148 KiB
#include<iostream> #include<vector> #include<algorithm> using namespace std; #pragma GCC optimize("Ofast") #pragma GCC optimize("no-stack-protector") #pragma GCC optimize("unroll-loops") #pragma GCC optimize("fast-math") #pragma GCC optimize("vpt") vector<vector<int>> t; vector<int> mx, ans, a; void build(int v, int l, int r) { if (l == r) { t[v] = { a[l] }; mx[v] = a[l]; ans[v] = 0; return; } int m = (l + r) >> 1; build(2 * v, l, m); build(2 * v + 1, m + 1, r); t[v].resize(t[2 * v].size() + t[2 * v + 1].size()); merge(t[2 * v].begin(), t[2 * v].end(), t[2 * v + 1].begin(), t[2 * v + 1].end(), t[v].begin()); ans[v] = max(ans[2 * v], ans[2 * v + 1]); mx[v] = max(mx[2 * v], mx[2 * v + 1]); int pos1 = lower_bound(t[2 * v + 1].begin(), t[2 * v + 1].end(), mx[2 * v]) - t[2 * v + 1].begin(); pos1--; if (pos1 >= 0) { ans[v] = max(ans[v], mx[2 * v] + t[2 * v + 1][pos1]); } } void get(int v, int tl, int tr, int l, int r, vector<int>& vert) { if (tl > tr || l > r) return; if (tl == l && tr == r) { vert.push_back(v); return; } int tm = (tl + tr) >> 1; get(2 * v, tl, tm, l, min(r, tm), vert); get(2 * v + 1, tm + 1, tr, max(l, tm + 1), r, vert); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, q; cin >> n >> q; t.resize(4 * n); a.resize(n); mx.resize(4 * n); ans.resize(4 * n); int min1 = 1e9; for (int& i : a) { cin >> i; min1 = min(min1, i); } int max1 = 0; vector<vector<int>> queri(q); for (int i = 0; i < q; ++i) { int l, r, c; cin >> l >> r >> c; queri[i] = { l - 1,r - 1,c }; max1 = max(max1, c); } if (max1 < min1) { vector<int> pr(n + 1); for (int i = 0; i < n; ++i) { if (i != 0 && a[i] >= a[i - 1]) { pr[i + 1] = 1 + pr[i]; } else { pr[i + 1] = pr[i]; } } for (int j = 0; j < q; ++j) { int l, r, c; l = queri[j][0]; r = queri[j][1]; c = queri[j][2]; if (c < min1) { if (pr[r + 1] - pr[l + 1] == r - l) { cout << "1\n"; } else { cout << "0\n"; } continue; } } return 0; } build(1, 0, n - 1); for (int j = 0; j < q; ++j) { int l, r, c; l = queri[j][0]; r = queri[j][1]; c = queri[j][2]; vector<int> vert; get(1, 0, n - 1, l, r, vert); int x = 0; for (auto v : vert) { x = max(x, ans[v]); } int curmax = t[vert[0]].back(); for (int i = 1; i < vert.size(); ++i) { int v = vert[i]; int pos1 = lower_bound(t[v].begin(), t[v].end(), curmax) - t[v].begin(); pos1--; if (pos1 >= 0) { x = max(x, curmax + t[v][pos1]); } curmax = max(curmax, t[v].back()); } if (x <= c) { cout << "1\n"; } else cout << "0\n"; } }

Compilation message (stderr)

sortbooks.cpp: In function 'int main()':
sortbooks.cpp:106:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |         for (int i = 1; i < vert.size(); ++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...