#![allow(non_snake_case, unused_imports)] use std::collections::{BinaryHeap, HashMap, HashSet}; use ac_library::{Additive, Segtree}; use proconio::{input, marker::Usize1, marker::Chars}; use itertools::Itertools; #[allow(unused_macros)] macro_rules! d { ( $( $x:expr ),* $(,)? ) => { eprintln!( concat!( $( stringify!($x), "={:?} " ),* ), $( $x ),* ); }; } #[allow(dead_code)] fn yn(b: bool) -> &'static str { if b { "Yes" } else { "No" } } fn grid_overlap(a: (usize, usize), b: (usize, usize)) -> Option<(usize, usize)> { if a.0 <= b.0 && b.0 <= a.1 { Some((b.0, a.1.min(b.1))) } else if b.0 <= a.0 && a.0 <= b.1 { Some((a.0, b.1.min(a.1))) } else { None } } fn main() { input! { N: usize, A: [Usize1; N], Q: usize, } let freq = A.iter().counts(); let mut one_segt = Segtree::>::new(N); let mut two_segt = Segtree::>::new(N); for (k, v) in freq.into_iter() { if v >= 1 { one_segt.set(*k, 1); } if v >= 2 { two_segt.set(*k, 1); } } let f = |l: usize, r: usize, segt: &Segtree>| -> bool { let res = segt.prod(l..=r) as usize; res == r-l+1 }; for _ in 0..Q { input! { L1: Usize1, R1: Usize1, L2: Usize1, R2: Usize1, } let ans = if let Some((ol, or)) = grid_overlap((L1, R1), (L2, R2)) { let l = L1.min(L2); let r = R1.max(R2); let a = f(l, ol, &one_segt); let b = f(ol, or, &two_segt); let c = f(or, r, &one_segt); a && b && c } else { let a = f(L1, R1, &one_segt); let b = f(L2, R2, &one_segt); a && b }; println!("{}", yn(ans)); } }