/*
Mayoeba Yabureru
*/
#pragma GCC optimize("O3,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5;
int tree[N * 4], lazy[N * 4], mode = 0;
int merge (int x, int y) {
if (mode == 0) return max(x, y);
else return min(x, y);
}
int def () {
if (mode == 0) return -1;
else return N + 1;
}
void push (int node, int l, int r) {
tree[node] = merge(tree[node], lazy[node]);
if (l != r) {
lazy[node * 2] = merge(lazy[node * 2], lazy[node]);
lazy[node * 2 + 1] = merge(lazy[node * 2 + 1], lazy[node]);
}
lazy[node] = def();
}
void update (int x, int y, int val, int node = 1, int l = 0, int r = N) {
push(node, l, r);
if (y < l || r < x) return;
if (x <= l && r <= y) {
lazy[node] = val;
push(node, l, r);
return;
}
int mid = (l + r) / 2;
update(x, y, val, node * 2, l, mid);
update(x, y, val, node * 2 + 1, mid + 1, r);
tree[node] = merge(tree[node * 2], tree[node * 2 + 1]);
}
int query (int x, int node = 1, int l = 0, int r = N) {
push(node, l, r);
if (x < l || r < x) return def();
if (l == r) return tree[node];
int mid = (l + r) / 2;
return merge(query(x, node * 2, l, mid), query(x, node * 2 + 1, mid + 1, r));
}
int tree1[N * 4];
void update1 (int x, int val, int node = 1, int l = 0, int r = N) {
if (x < l || r < x) return;
if (l == r) {
tree1[node] = merge(tree1[node], val);
return;
}
int mid = (l + r) / 2;
update1(x, val, node * 2, l, mid);
update1(x, val, node * 2 + 1, mid + 1, r);
tree1[node] = merge(tree1[node * 2], tree1[node * 2 + 1]);
}
int query1 (int x, int y, int node = 1, int l = 0, int r = N) {
if (y < l || r < x) return def();
if (x <= l && r <= y) return tree1[node];
int mid = (l + r) / 2;
return merge(query1(x, y, node * 2, l, mid), query1(x, y, node * 2 + 1, mid + 1, r));
}
int tree2[N * 4];
void update2 (int x, int val, int node = 1, int l = 0, int r = N) {
if (x < l || r < x) return;
if (l == r) {
tree2[node] = max(tree2[node], val);
return;
}
int mid = (l + r) / 2;
update2(x, val, node * 2, l, mid);
update2(x, val, node * 2 + 1, mid + 1, r);
tree2[node] = max(tree2[node * 2], tree2[node * 2 + 1]);
}
int query2 (int x, int y, int node = 1, int l = 0, int r = N) {
if (y < l || r < x) return -1;
if (x <= l && r <= y) return tree2[node];
int mid = (l + r) / 2;
return max(query2(x, y, node * 2, l, mid), query2(x, y, node * 2 + 1, mid + 1, r));
}
void solve() {
int n;
cin >> n;
vector a(n, 0), b = a, left(n, -1), right(n, n);
for (int i = 0; i < n; i ++) cin >> a[i];
for (int i = 0; i < n; i ++) cin >> b[i];
for (int i = 0; i < n; i ++) {
for (int j = 0; j < n; j ++) {
if (i == j) continue;
if (b[j] < b[i] && a[j] > b[i]) {
if (j < i) left[i] = max(left[i], j);
else right[i] = min(right[i], j);
}
if (b[i] < b[j] && a[i] > b[j]) {
if (j < i) left[i] = max(left[i], j);
else right[i] = min(right[i], j);
}
}
}
vector<vector<int>> events;
for (int i = 0; i < n; i ++) events.push_back({left[i], i});
int q;
cin >> q;
vector ans(q, 0);
for (int i = 0; i < n; i ++) {
int l, r;
cin >> l >> r;
l --, r--;
events.push_back({l, -100000, r, i});
}
sort(events.begin(), events.end());
for (auto v : events) {
int l = v[0], r = v[1];
if (r < 0) {
r = v[2];
if (r < query2(l, r)) ans[v[3]] = 0;
else ans[v[3]] = 1;
}
else update2(r, right[r]);
}
for (int i = 0; i < q; i ++) {
if (ans[i]) cout << "Yes\n";
else cout << "No\n";
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int T = 1;
for (int I = 1; I <= T; I++) {
solve();
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |