Submission #1214655

#TimeUsernameProblemLanguageResultExecution timeMemory
1214655trimkusGift Exchange (JOI24_ho_t4)C++20
100 / 100
1524 ms74920 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; struct RMQ { int n; int mn; vector<int> tree, lz; void init(int n, bool gr) { this->n = n; mn = (gr ? -(n / 2 + 1) : 0); tree = vector<int>(4 * n, mn); lz = vector<int>(4 * n, mn); } void push(int i) { for (int x : {i * 2, i * 2 + 1}) { tree[x] = max(tree[x], lz[i]); lz[x] = max(lz[x], lz[i]); } lz[i] = mn; } void update(int i, int l, int r, int ql, int qr, int d) { if (l > qr || r < ql) return; if (ql <= l && r <= qr) { tree[i] = max(tree[i], d); lz[i] = max(lz[i], d); return; } push(i); int m = (l + r) / 2; update(i * 2, l, m, ql, qr, d); update(i * 2 + 1, m + 1, r, ql, qr, d); tree[i] = max(tree[i * 2], tree[i * 2 + 1]); } void update(int ql, int qr, int d) { update(1, 1, n, ql, qr, d); } int query(int i, int l, int r, int ql, int qr) { if (l > qr || r < ql) return mn; if (ql <= l && r <= qr) { return tree[i]; } push(i); int m = (l + r) / 2; return max(query(i * 2, l, m, ql, qr), query(i * 2 + 1, m + 1, r, ql, qr)); } int query(int ql, int qr) { return query(1, 1, n, ql, qr); } }; struct Fenwick { int n; vector<int> bit; Fenwick(int n) { this->n = 2 * n; bit = vector<int>(2 * n + 2); } void update(int i, int delta) { for (i += 1; i <= n; i += i & -i) { bit[i] += delta; } } void update(int l, int r, int delta) { update(l, delta); update(r + 1, -delta); } int query(int r) { int res = 0; for (r += 1; r > 0; r-= r & -r) { res += bit[r]; } return res; } }; int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; vector<int> a(n + 1), b(n + 1); for (int i = 1; i <= n; ++i) { cin >> a[i]; } for (int i = 1; i <= n; ++i) { cin >> b[i]; } RMQ seg; seg.init(2 * n, false); vector<int> left(n + 1), right(n + 1); for (int i = 1; i <= n; ++i) { int l = seg.query(b[i], a[i]) + 1; left[i] = l; seg.update(b[i], a[i], i); } seg.init(2 * n, true); for (int i = n; i >= 1; --i) { int r = seg.query(b[i], a[i]); if (r == 0) r = n + 1; else r = -r; right[i] = r; seg.update(b[i], a[i], -i); //~ cerr << seg.query(1, 2 * n) << "\n"; } Fenwick tree(n); vector<vector<int>> events(n + 2); for (int i = 1; i <= n; ++i) { events[right[i]].push_back(-i); } int q; cin >> q; vector<int> res(q); vector<int> ql(q), qr(q); for (int i = 0; i < q; ++i) { cin >> ql[i] >> qr[i]; events[qr[i]].push_back(i); } //~ cout << "Intervals:\n"; //~ for (int i = 1; i <= n; ++i) { //~ cout << left[i] << " " << right[i] << "\n"; //~ } for (int i = 1; i <= n; ++i) { tree.update(left[i], i, +1); for (auto& j : events[i]) { if (j < 0) { tree.update(left[-j], -j, -1); } else { res[j] = tree.query(ql[j]); } } } for (int i = 0; i < q; ++i) { cout << (res[i] > 0 ? "No\n" : "Yes\n"); } }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...