#[allow(unused)] use ac_library::*; #[allow(unused)] use itertools::Itertools; #[allow(unused)] use proconio::{marker::*, *}; #[allow(unused)] use std::collections::*; fn main() { input! { n: usize, m: usize, q: usize, a: [Usize1; n], mut uvw: [(Usize1, Usize1, i32); m], } let mut ans = vec![-1; q]; let mut a = a .into_iter() .map(|a| std::iter::once(a).collect::>()) .collect::>(); let mut b = std::iter::repeat_n(BinaryHeap::new(), n).collect::>(); for i in 0..q { input! { s: Usize1, c: usize, } if c == 1 { ans[i] = 0; } else { b[s].push((!c, i)); } } uvw.sort_unstable_by_key(|&(_, _, w)| w); let mut uf = Dsu::new(n); for (u, v, w) in uvw { let u = uf.leader(u); let v = uf.leader(v); if u == v { continue; } let z = uf.merge(u, v); let mut a1 = std::mem::take(&mut a[u]); let mut a2 = std::mem::take(&mut a[v]); let mut b1 = std::mem::take(&mut b[u]); let mut b2 = std::mem::take(&mut b[v]); if a1.len() < a2.len() { std::mem::swap(&mut a1, &mut a2); } a1.extend(a2); if b1.len() < b2.len() { std::mem::swap(&mut b1, &mut b2); } b1.extend(b2); while let Some(&(c, i)) = b1.peek() { if !c > a1.len() { break; } b1.pop(); ans[i] = w; } a[z] = a1; b[z] = b1; } for x in ans { println!("{x}"); } }