AtCoder Beginner Contest 343 D

https://atcoder.jp/contests/abc343/tasks/abc343_d

選手ごとの得点のテーブルと、どの得点に何人いるかのマップを持っておきます。

// Diversity of Scores
#![allow(non_snake_case)]


//////////////////// 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()
}


//////////////////// Scores ////////////////////

use std::collections::HashMap;

struct Scores {
    table: Vec<i64>,
    counter: HashMap<i64, usize>
}

impl Scores {
    fn new(N: usize) -> Scores {
        let table: Vec<i64> = vec![0; N];
        let mut counter = HashMap::new();
        counter.insert(0, N);
        Scores { table, counter }
    }
    
    fn add(&mut self, A: usize, B: i64) {
        let prev = self.table[A];
        self.table[A] += B;
        let e1 = self.counter.get_mut(&prev).unwrap();
        *e1 -= 1;
        if *e1 == 0 {
            self.counter.remove(&prev);
        }
        let e2 = self.counter.entry(self.table[A]).or_insert(0);
        *e2 += 1
    }
    
    fn diversity(&self) -> usize {
        self.counter.len()
    }
}


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

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

fn read_query() -> (usize, i64) {
    let v = read_vec::<usize>();
    let (A, B) = (v[0]-1, v[1] as i64);
    (A, B)
}

fn F(N: usize, T: usize) {
    let mut scores = Scores::new(N);
    for _ in 0..T {
        let (A, B) = read_query();
        scores.add(A, B);
        println!("{}", scores.diversity())
    }
}

fn main() {
    let (N, T) = read_input();
    F(N, T)
}