module main; // https://kmjp.hatenablog.jp/entry/2014/11/10/0900 より import std; // BinaryIndexTree struct BIT(T) { int n; // 配列の要素数(数列の要素数+1) T[] bit; // データの格納先(1-index)。初期値は0 this(int n) { this.n = n + 1; bit = new T[](this.n); } // A_i += x void add(int i, T x) { for (int idx = i; idx < n; idx += (idx & -idx)) bit[idx] += x; } // A_1からA_iまでの和 T sum(int i) { T s = 0; for (int idx = i; idx > 0; idx -= (idx & -idx)) s += bit[idx]; return s; } // A_lからA_rまでの和 T sum(int l, int r) { return sum(r - 1) - sum(l - 1); } } void main() { // 入力 int N, K; readln.chomp.formattedRead("%d %d", N, K); // 答えの計算と出力 const NUM = 1 << 20; auto bit = BIT!int(NUM); auto W = new int[](1_000_001); foreach (_; 0 .. N) { int x = readln.chomp.to!int; if (x > 0) { if (bit.sum(x, NUM) < K) { bit.add(x, 1); W[x]++; } } else { if (W[-x]) { W[-x]--; bit.add(-x, -1); } } } writeln(bit.sum(NUM)); }