#[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], } if a.iter().enumerate().any(|(i, &a)| a != i) { panic!() } let mut ans = vec![-1; q]; 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 size = uf.size(z); let mut b1 = std::mem::take(&mut b[u]); let mut b2 = std::mem::take(&mut b[v]); // if b1.len() < b2.len() { std::mem::swap(&mut b1, &mut b2); // } b1.extend(b2); while let Some(&(c, i)) = b1.peek() { if !c > size { break; } b1.pop(); ans[i] = w; } b[z] = b1; } for x in ans { println!("{x}"); } }