using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Numerics; using System.Text; using static System.Console; using static System.Convert; using static System.Math; using static Extentions; class IO { int idx; string[] input = In.ReadToEnd().Split(new[] { " ", "\n", "\r" }, StringSplitOptions.RemoveEmptyEntries); T Get(Func parser) => parser(input[idx++]); public string S => Get(s => s); public char C => Get(char.Parse); public int I => Get(int.Parse); public long L => Get(long.Parse); public double F => Get(double.Parse); public decimal D => Get(decimal.Parse); public BigInteger B => Get(BigInteger.Parse); T[] Gets(int n, Func parser) => input.Skip((idx += n) - n).Take(n).Select(parser).ToArray(); public string[] Ss(int n) => Gets(n, s => s); public char[] Cs(int n) => Gets(n, char.Parse); public int[] Is(int n) => Gets(n, int.Parse); public long[] Ls(int n) => Gets(n, long.Parse); public double[] Fs(int n) => Gets(n, double.Parse); public decimal[] Ds(int n) => Gets(n, decimal.Parse); public BigInteger[] Bs(int n) => Gets(n, BigInteger.Parse); public void Write(params T[] xs) => WriteLine(string.Join(" ", xs)); public void Write(params object[] xs) => WriteLine(string.Join(" ", xs)); } #region Library #region Integer interface IInteger { T MinusOne { get; } T One { get; } T Zero { get; } T Add(T left, T right); int Compare(T left, T right); T Divide(T dividend, T divisor); T Multiply(T left, T right); T Negate(T value); T Remainder(T dividend, T divisor); T Subtract(T left, T right); } static class Integer { static IInteger i = new IntOperations(); static IInteger l = new LongOperations(); static IInteger bi = new BigIntegerOperations(); public static IInteger Default { get { if (typeof(T) == typeof(int)) return (IInteger)i; if (typeof(T) == typeof(long)) return (IInteger)l; if (typeof(T) == typeof(BigInteger)) return (IInteger)bi; throw new NotSupportedException(); } } } class IntOperations : IInteger { public int MinusOne => -1; public int One => 1; public int Zero => 0; public int Add(int left, int right) => checked(left + right); public int Compare(int left, int right) => left.CompareTo(right); public int Divide(int dividend, int divisor) => dividend / divisor; public int Multiply(int left, int right) => checked(left * right); public int Negate(int value) => checked(-value); public int Remainder(int dividend, int divisor) => dividend % divisor; public int Subtract(int left, int right) => checked(left - right); } class LongOperations : IInteger { public long MinusOne => -1; public long One => 1; public long Zero => 0; public long Add(long left, long right) => checked(left + right); public int Compare(long left, long right) => left.CompareTo(right); public long Divide(long dividend, long divisor) => dividend / divisor; public long Multiply(long left, long right) => checked(left * right); public long Negate(long value) => checked(-value); public long Remainder(long dividend, long divisor) => dividend % divisor; public long Subtract(long left, long right) => checked(left - right); } class BigIntegerOperations : IInteger { public BigInteger MinusOne => BigInteger.MinusOne; public BigInteger One => BigInteger.One; public BigInteger Zero => BigInteger.Zero; public BigInteger Add(BigInteger left, BigInteger right) => BigInteger.Add(left, right); public int Compare(BigInteger left, BigInteger right) => BigInteger.Compare(left, right); public BigInteger Divide(BigInteger dividend, BigInteger divisor) => BigInteger.Divide(dividend, divisor); public BigInteger Multiply(BigInteger left, BigInteger right) => BigInteger.Multiply(left, right); public BigInteger Negate(BigInteger value) => BigInteger.Negate(value); public BigInteger Remainder(BigInteger dividend, BigInteger divisor) => BigInteger.Remainder(dividend, divisor); public BigInteger Subtract(BigInteger left, BigInteger right) => BigInteger.Subtract(left, right); } #endregion #region Monoid interface IMonoid { T Mempty { get; } T Mappend(T a, T b); } class Monoid : IMonoid { public T Mempty { get; private set; } Func mappend; public T Mappend(T a, T b) => mappend(a, b); public Monoid(T mempty, Func mappend) { this.Mempty = mempty; this.mappend = mappend; } public static IMonoid GetSumMonoid() => new IntegerSumMonoid(Integer.Default); public static IMonoid GetSumMonoid(IInteger integer) => new IntegerSumMonoid(integer); public static IMonoid GetMinMonoid(T upperBound) => new IntegerMinMonoid(Integer.Default, upperBound); public static IMonoid GetMinMonoid(IInteger integer, T upperBound) => new IntegerMinMonoid(integer, upperBound); public static IMonoid GetMaxMonoid(T lowerBound) => new IntegerMaxMonoid(Integer.Default, lowerBound); public static IMonoid GetMaxMonoid(IInteger integer, T lowerBound) => new IntegerMaxMonoid(integer, lowerBound); } class IntegerSumMonoid : IMonoid { protected readonly IInteger integer; public T Mempty => integer.Zero; public T Mappend(T a, T b) => integer.Add(a, b); public IntegerSumMonoid(IInteger integer) { this.integer = integer; } } class IntegerMinMonoid : IMonoid { protected readonly IInteger integer; public T Mempty { get; private set; } public T Mappend(T a, T b) => integer.Compare(a, b) < 0 ? a : b; public IntegerMinMonoid(IInteger integer, T upperBound) { this.integer = integer; this.Mempty = upperBound; } } class IntegerMaxMonoid : IMonoid { protected readonly IInteger integer; public T Mempty { get; private set; } public T Mappend(T a, T b) => integer.Compare(a, b) > 0 ? a : b; public IntegerMaxMonoid(IInteger integer, T lowerBound) { this.integer = integer; this.Mempty = lowerBound; } } #endregion #region Group interface IGroup : IMonoid { T InvMappend(T a, T b); } class Group : Monoid, IGroup { Func invMappend; public T InvMappend(T a, T b) => invMappend(a, b); public Group(T mempty, Func mappend, Func invMappend) : base(mempty, mappend) { this.invMappend = invMappend; } public static IGroup GetSumGroup() => new IntegerSumGroup(Integer.Default); public static IGroup GetSumGroup(IInteger integer) => new IntegerSumGroup(integer); } class IntegerSumGroup : IntegerSumMonoid, IGroup { public T InvMappend(T a, T b) => integer.Subtract(a, b); public IntegerSumGroup(IInteger integer) : base(integer) { } } #endregion class BinaryIndexedTree { T[] tree; public readonly int N; public readonly IMonoid Monoid; readonly bool supportsGroup = false; // O(N) public BinaryIndexedTree(int n, IMonoid monoid) { N = n; Monoid = monoid; tree = Enumerable.Repeat(monoid.Mempty, n + 1).ToArray(); } // O(N) public BinaryIndexedTree(IEnumerable collection, IMonoid monoid) { N = collection.Count(); Monoid = monoid; tree = new T[N + 1]; for (var i = 0; i < N; i++) tree[i + 1] = collection.ElementAt(i); for (var i = 1; i < N; i++) { var j = i + (i & -i); if (j < N) tree[j] = monoid.Mappend(tree[j], tree[i]); } } // O(N) public BinaryIndexedTree(int n, IGroup group) : this(n, (IMonoid)group) { supportsGroup = true; } // O(N) public BinaryIndexedTree(IEnumerable collection, IGroup group) : this(collection, (IMonoid)group) { supportsGroup = true; } public T this[int i] { // O(log N) get { return this[i, i]; } // O(log N) set { if (!supportsGroup) throw new InvalidOperationException(); var group = (IGroup)Monoid; Append(i, group.InvMappend(value, this[i])); } } public T this[int i, int j] { // O(log N) get { if (!supportsGroup) throw new InvalidOperationException(); var group = (IGroup)Monoid; var acc = group.Mempty; j++; for (; j > i; j -= j & -j) acc = group.Mappend(acc, tree[j]); for (; i > j; i -= i & -i) acc = group.InvMappend(acc, tree[i]); return acc; } } // O(log N) public T Concat(int i) { var acc = Monoid.Mempty; for (i++; i > 0; i -= i & -i) acc = Monoid.Mappend(acc, tree[i]); return acc; } // O(log N) public void Append(int i, T d) { for (i++; i <= N; i += i & -i) tree[i] = Monoid.Mappend(tree[i], d); } } static partial class Extentions { public static T Gcd(T x, T y, IInteger integer) { T r; while (integer.Compare((r = integer.Remainder(x, y)), integer.Zero) != 0) { x = y; y = r; } return y; } public static T Lcm(T x, T y, IInteger integer) => integer.Multiply(integer.Divide(x, Gcd(x, y, integer)), y); } #endregion static class Program { public static void Main() { var sw = new StreamWriter(OpenStandardOutput()) { NewLine = "\n" }; #if DEBUG sw.AutoFlush = true; #else sw.AutoFlush = false; #endif SetOut(sw); Solve(new IO()); Out.Flush(); } static void Solve(IO io) { const int wMax = 1000000; var n = io.I; var k = io.I; var bit = new BinaryIndexedTree(wMax + 1, Group.GetSumGroup()); for (var i = 0; i < n; i++) { var w = io.I; if (w > 0 && bit[w, wMax] < k) bit[w]++; if (w < 0 && bit[-w] > 0) bit[-w]--; } io.Write(bit.Concat(wMax)); } }