제출 #1107999

#제출 시각아이디문제언어결과실행 시간메모리
1107999_callmelucianGift Exchange (JOI24_ho_t4)C++14
100 / 100
1247 ms98344 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef pair<ll,ll> pl; typedef pair<int,int> pii; typedef tuple<int,int,int> tt; #define all(a) a.begin(), a.end() #define filter(a) a.erase(unique(all(a)), a.end()) struct lazyIT { vector<int> tr, lazy; lazyIT (int sz) : tr(4 * sz), lazy(4 * sz) {} void apply (int k, int val) { tr[k] = max(tr[k], val), lazy[k] = max(lazy[k], val); } void pushDown (int k) { if (lazy[k]) apply(2 * k, lazy[k]), apply(2 * k + 1, lazy[k]), lazy[k] = 0; } void update (int a, int b, int val, int k, int l, int r) { if (b < l || r < a) return; if (a <= l && r <= b) return apply(k, val), void(); pushDown(k); int mid = (l + r) >> 1; update(a, b, val, 2 * k, l, mid); update(a, b, val, 2 * k + 1, mid + 1, r); tr[k] = max(tr[2 * k], tr[2 * k + 1]); } int query (int a, int b, int k, int l, int r) { if (b < l || r < a) return 0; if (a <= l && r <= b) return tr[k]; pushDown(k); int mid = (l + r) >> 1; return max(query(a, b, 2 * k, l, mid), query(a, b, 2 * k + 1, mid + 1, r)); } }; struct IT { vector<int> tr; IT (int sz) : tr(4 * sz) {} void update (int pos, int val, int k, int l, int r) { if (pos < l || r < pos) return; if (l == r) return tr[k] = val, void(); int mid = (l + r) >> 1; update(pos, val, 2 * k, l, mid); update(pos, val, 2 * k + 1, mid + 1, r); tr[k] = min(tr[2 * k], tr[2 * k + 1]); } int query (int a, int b, int k, int l, int r) { if (b < l || r < a) return INT_MAX; if (a <= l && r <= b) return tr[k]; int mid = (l + r) >> 1; return min(query(a, b, 2 * k, l, mid), query(a, b, 2 * k + 1, mid + 1, r)); } }; vector<int> lastIntersect (const vector<pii> &vec, int n) { vector<int> ans(n + 1); lazyIT tree(2 * n); for (int i = 1; i <= n; i++) { int a, b; tie(a, b) = vec[i]; ans[i] = tree.query(a, b, 1, 1, 2 * n); tree.update(a, b, i, 1, 1, 2 * n); } return ans; } template <typename T> vector<T> rev (const vector<T> &vec, int n) { vector<T> ans(n + 1); for (int i = 1; i <= n; i++) ans[n - i + 1] = vec[i]; return ans; } const int mn = 1e6 + 6; vector<int> sweep[mn]; vector<pii> qry[mn]; bool ans[mn]; int main() { ios::sync_with_stdio(0); cin.tie(0); // read input int n; cin >> n; vector<pii> vec(n + 1); for (int i = 1; i <= n; i++) cin >> vec[i].second; for (int i = 1; i <= n; i++) cin >> vec[i].first; // process queries vector<int> toLeft = lastIntersect(vec, n); vector<int> toRight = rev(lastIntersect(rev(vec, n), n), n); IT tree(n); for (int i = 1; i <= n; i++) { tree.update(i, toLeft[i], 1, 1, n); sweep[n - toRight[i] + 1].push_back(i); } // read query int q; cin >> q; for (int i = 0; i < q; i++) { int l, r; cin >> l >> r; qry[r].emplace_back(l, i); } // process queries for (int i = 1; i <= n; i++) { for (int u : sweep[i]) tree.update(u, u, 1, 1, n); for (pii item : qry[i]) { int l, idx; tie(l, idx) = item; ans[idx] = tree.query(l, i, 1, 1, n) >= l; } } // answer queries for (int i = 0; i < q; i++) cout << (ans[i] ? "Yes" : "No") << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...