Files
CodeObject/storage/jungol/rs/completed/8406.rs

64 lines
1.5 KiB
Rust

use std::io::{read_to_string, stdin};
struct ReligionState {
parents: Vec<usize>,
counts: Vec<usize>,
}
impl ReligionState {
fn find(&self, x: usize) -> usize {
let mut node = x;
while (node != self.parents[node]) {
node = self.parents[node];
}
return node;
}
fn sames(&self, x: usize) -> usize {
return self.counts[self.find(x)];
}
fn unite(&mut self, x: usize, y: usize) {
let rx = self.find(x);
let ry = self.find(y);
if rx < ry {
self.parents[ry] = rx;
self.counts[rx] += self.counts[ry];
} else if rx > ry {
self.parents[rx] = ry;
self.counts[ry] += self.counts[rx]
} else {
}
}
}
fn main() {
let temp = read_to_string(stdin()).unwrap();
let mut iter = temp
.split_ascii_whitespace()
.map(|x| x.parse::<usize>().unwrap());
let n = iter.next().unwrap();
let q = iter.next().unwrap();
let mut parents = (0..n).map(|i| i).collect::<Vec<_>>();
let mut S = ReligionState {
parents,
counts: (0..n).map(|_| 1).collect(),
};
for _ in 0..q {
let query = iter.next().unwrap();
if (query == 1) {
let (x, y) = (iter.next().unwrap() - 1, iter.next().unwrap() - 1);
S.unite(x, y);
} else {
let x = iter.next().unwrap() - 1;
println!("{}", S.sames(x));
}
}
}