~が~以上/以下の間~するみたいなそういう問題では大体の場合 ヒープ が使えます(多分)。ヒープを使うと、毎クエリでヒープのトップが h 以下の間、ポップし続ければいい話です。
// MinHeapは自前の型です。最小ヒープ(小さいのがトップに来るヒープ)のことです。
fn main() {
let mut sc = Scanner::new();
let mut wr = Writer::new();
input!(
sc,
q: usize
);
let mut hq: MinHeap<usize> = MinHeap::new();
for _ in 0..q {
input!(
sc,
t, h: usize
);
match t {
1 => {
// ヒープに h を入れる
hq.push(h);
}
2 => {
while let Some(top) = hq.pop() {
// ヒープの最小値が h よりも大きくなったら取り出し終了
if top > h {
hq.push(top);
break;
}
}
}
_ => {}
}
// ヒープの要素数(木の本数)を出力
wr.println(hq.len());
}
}
提出コード(Rust)
https://atcoder.jp/contests/abc451/submissions/74529161