제출 #1213829

#제출 시각아이디문제언어결과실행 시간메모리
1213829mdn2002Gift Exchange (JOI24_ho_t4)C++20
50 / 100
2594 ms26016 KiB
/* 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)); } 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 < 4 * N; i ++) { tree[i] = lazy[i] = tree1[i] = def(); } for (int i = 0; i < n; i ++) { left[i] = max(left[i], query(b[i])); left[i] = max(left[i], query1(b[i] + 1, a[i] - 1)); update(b[i] + 1, a[i] - 1, i); update1(b[i], i); } mode = 1; for (int i = 0; i < 4 * N; i ++) { tree[i] = lazy[i] = tree1[i] = def(); } for (int i = n - 1; i >= 0; i --) { right[i] = min(right[i], query(b[i])); right[i] = min(right[i], query1(b[i] + 1, a[i] - 1)); update(b[i] + 1, a[i] - 1, i); update1(b[i], i); } int q; cin >> q; while (q --) { int l, r, can = 1; cin >> l >> r; l --, r--; for (int i = l; i <= r; i ++) { if (left[i] < l && r < right[i]) can = 0; } if (can) cout << "Yes" << endl; else cout << "No" << endl; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int T = 1; for (int I = 1; I <= T; I++) { solve(); } }
#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...