Submission #501388

#TimeUsernameProblemLanguageResultExecution timeMemory
501388zhougz역사적 조사 (JOI14_historical)C++17
100 / 100
1039 ms7772 KiB
/** * author: zhougz * created: 03/01/2022 10:55:06 **/ #include "bits/stdc++.h" using namespace std; int blk_sz; struct query { int l, r, idx; bool operator<(const query &rhs) const { return l / blk_sz != rhs.l / blk_sz ? l < rhs.l : (r < rhs.r) ^ ((l / blk_sz) & 1); } }; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, q; cin >> n >> q; blk_sz = n / sqrt(q); vector<int> arr(n); for (int i = 0; i < n; i++) { cin >> arr[i]; } vector<query> queries(q); for (int i = 0; i < q; i++) { cin >> queries[i].l >> queries[i].r; queries[i].l--; queries[i].r--; queries[i].idx = i; } sort(queries.begin(), queries.end()); vector<int> v(arr.begin(), arr.end()); sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); vector<int> idx(n); for (int i = 0; i < n; i++) { idx[i] = lower_bound(v.begin(), v.end(), arr[i]) - v.begin(); } const int N = 1 << (int)ceil(log2(v.size())); vector<long long> t(2 * N); auto update = [&](int x, int val) { t[x += N] += val; while ((x >>= 1) != 0) { t[x] = max(t[x << 1], t[(x << 1) + 1]); } }; auto add = [&](int x) { update(idx[x], arr[x]); }; auto remove = [&](int x) { update(idx[x], -arr[x]); }; vector<long long> res(q); int cur_l = 0, cur_r = -1; for (const auto &[l, r, idx] : queries) { while (cur_l < l) { remove(cur_l++); } while (cur_l > l) { add(--cur_l); } while (cur_r < r) { add(++cur_r); } while (cur_r > r) { remove(cur_r--); } res[idx] = t[1]; } for (auto x : res) { cout << x << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...