use fio::*; use std::collections::HashMap; const M: u32 = 998_244_353; fn main() { let [rn, m] = read_tuple::(); let mut uv = vec![]; for _ in 0..m { let [u, v] = read_tuple::(); uv.push((u, v)); } enum Q { Follow(usize, usize), Toggle(usize), } let mut hs: HashMap = HashMap::new(); let q = read::(); let mut qs = vec![]; let mut get = |i: i32| { let sz = hs.len(); *hs.entry(i).or_insert(sz) }; for _ in 0..q { let [q, a, b] = read_tuple::(); match q { 1 => { let a = get(a); let b = get(b); qs.push(Q::Follow(a, b)); } 2 => { let a = get(a); assert_eq!(b, -1); qs.push(Q::Toggle(a)); } _ => panic!(), } } let n = hs.len(); let mut conn = vec![vec![false; n]; n]; let mut open = vec![true; n]; for (u, v) in uv { let Some(u) = hs.get(&u) else { continue }; let Some(v) = hs.get(&v) else { continue }; conn[*u][*v] = true; } for q in qs { match q { Q::Follow(a, b) => { conn[a][b] = !conn[a][b]; println!( "{}", (0..n) .filter(|&i| i != a && (open[i] || conn[a][i])) .count() + (rn - n) ) } Q::Toggle(a) => { open[a] = !open[a]; println!( "{}", (0..n) .filter(|&i| i != a && (open[i] || conn[a][i])) .count() + (rn - n) ) } } } } mod fio { use std::{ cell::RefCell, convert::TryInto, fmt::Debug, io::{BufRead, BufWriter, StdinLock, StdoutLock, stdin, stdout}, str::FromStr, }; thread_local! { pub static STDIN: RefCell> = RefCell::new(stdin().lock()); pub static STDOUT: RefCell>> = RefCell::new(BufWriter::new(stdout().lock())); } #[allow(dead_code)] pub fn read() -> T where ::Err: Debug, { read_line().parse().unwrap() } /// If there is a performance concern, use direct /// `read_line().spilt_ascii_whitespace().map(|x| x.parse().unwrap())` #[allow(dead_code)] pub fn read_vec() -> Vec where ::Err: Debug, { read_line() .split_ascii_whitespace() .map(|x| x.parse().unwrap()) .collect() } /// If there is a performance concern, use direct /// `read_line().spilt_ascii_whitespace().map(|x| x.parse().unwrap())` #[allow(dead_code)] pub fn read_tuple() -> [T; N] where T: FromStr + Debug, ::Err: Debug, { read_vec::().try_into().unwrap() } /// whitespace at the end of the line is ignored pub fn read_line() -> String { let mut s = String::new(); STDIN.with(|cell| { cell.borrow_mut().read_line(&mut s).unwrap(); }); String::from_str(s.trim_end()).unwrap() } } #[macro_export] macro_rules! print { ($($t:tt)*) => { fio::STDOUT.with(|cell|{ use std::io::Write; write!(cell.borrow_mut(), $($t)*).unwrap() })}; } #[macro_export] macro_rules! println { ($($t:tt)*) => { fio::STDOUT.with(|cell| { use std::io::Write; writeln!(cell.borrow_mut(), $($t)*).unwrap() }) }; } #[macro_export] macro_rules! flush { () => { fio::STDOUT.with(|cell| { use std::io::Write; cell.borrow_mut().flush().unwrap() }); }; }