AtCoder Beginner Contest 294 D

https://atcoder.jp/contests/abc294/tasks/abc294_d

BTreeSetを使えば簡単で、呼ばれていない人のsetと呼ばれたけど受付に行っていない人のsetを作ればよいです。
ただ、

let e = not_called.iter().next().unwrap();
not_called.remove(e);

だとcannot borrowと怒られてしまいますが、

let e = not_called.iter().next().unwrap();
let f = *e;
not_called.remove(&f);

とすればfにコピーされて通ります。

// Bank
#![allow(non_snake_case)]

use std::collections::BTreeSet;


//////////////////// library ////////////////////

fn read<T: std::str::FromStr>() -> T {
    let mut line = String::new();
    std::io::stdin().read_line(&mut line).ok();
    line.trim().parse().ok().unwrap()
}

fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    read::<String>().split_whitespace()
            .map(|e| e.parse().ok().unwrap()).collect()
}


//////////////////// process ////////////////////

fn read_input() -> (usize, usize) {
    let v = read_vec();
    let N: usize = v[0];
    let Q: usize = v[1];
    (N, Q)
}

fn f(N: usize, Q: usize) {
    let mut not_called = (1..N+1).collect::<BTreeSet<usize>>();
    let mut called = (1..N+1).collect::<BTreeSet<usize>>();
    for _ in 0..Q {
        let v: Vec<String> = read_vec();
        if v[0] == "1" {
            let e = not_called.iter().next().unwrap();
            let f = *e;
            not_called.remove(&f);
            called.insert(f);
        }
        else if v[0] == "2" {
            let e: usize = v[1].parse().ok().unwrap();
            called.remove(&e);
        }
        else {
            println!("{}", called.iter().next().unwrap())
        }
    }
}

fn main() {
    let (N, Q) = read_input();
    f(N, Q)
}