Submission #33312413


Source Code Expand

# i know brute
#  If you win, you live. You cannot win unless you fight.
from sys import  stdin,setrecursionlimit
input=stdin.readline
import heapq
import string
rd=lambda: map(lambda s: int(s), input().strip().split())
ri=lambda: int(input())
rs=lambda :input().strip()
from collections import defaultdict as unsafedict,deque,Counter as unsafeCounter
from bisect import bisect_left as bl, bisect_right as br
from random import randint
from math import gcd, floor,log2,factorial,radians,sin,cos
random = randint(1, 10 ** 9)
mod=10**9+7
def ceil(a,b):
	return (a+b-1)//b
class myDict:
	def __init__(self,func):
		self.RANDOM = randint(0,1<<32)
		self.default=func
		self.dict={}
	def __getitem__(self,key):
		myKey=self.RANDOM^key
		if myKey not in self.dict:
			self.dict[myKey]=self.default()
		return self.dict[myKey]
	def get(self,key,default):
		myKey=self.RANDOM^key
		if myKey not in self.dict:
			return default
		return self.dict[myKey]
	def __setitem__(self,key,item):
		myKey=self.RANDOM^key
		self.dict[myKey]=item
	def getKeys(self):
		return [self.RANDOM^i for i in self.dict]
	def __str__(self):
		return f'{[(self.RANDOM^i,self.dict[i]) for i in self.dict]}'


class SortedList:
	def __init__(self, iterable=[], _load=200):
		"""Initialize sorted list instance."""
		values = sorted(iterable)
		self._len = _len = len(values)
		self._load = _load
		self._lists = _lists = [values[i:i + _load] for i in range(0, _len, _load)]
		self._list_lens = [len(_list) for _list in _lists]
		self._mins = [_list[0] for _list in _lists]
		self._fen_tree = []
		self._rebuild = True

	def _fen_build(self):
		"""Build a fenwick tree instance."""
		self._fen_tree[:] = self._list_lens
		_fen_tree = self._fen_tree
		for i in range(len(_fen_tree)):
			if i | i + 1 < len(_fen_tree):
				_fen_tree[i | i + 1] += _fen_tree[i]
		self._rebuild = False

	def _fen_update(self, index, value):
		"""Update `fen_tree[index] += value`."""
		if not self._rebuild:
			_fen_tree = self._fen_tree
			while index < len(_fen_tree):
				_fen_tree[index] += value
				index |= index + 1

	def _fen_query(self, end):
		"""Return `sum(_fen_tree[:end])`."""
		if self._rebuild:
			self._fen_build()

		_fen_tree = self._fen_tree
		x = 0
		while end:
			x += _fen_tree[end - 1]
			end &= end - 1
		return x

	def _fen_findkth(self, k):
		"""Return a pair of (the largest `idx` such that `sum(_fen_tree[:idx]) <= k`, `k - sum(_fen_tree[:idx])`)."""
		_list_lens = self._list_lens
		if k < _list_lens[0]:
			return 0, k
		if k >= self._len - _list_lens[-1]:
			return len(_list_lens) - 1, k + _list_lens[-1] - self._len
		if self._rebuild:
			self._fen_build()

		_fen_tree = self._fen_tree
		idx = -1
		for d in reversed(range(len(_fen_tree).bit_length())):
			right_idx = idx + (1 << d)
			if right_idx < len(_fen_tree) and k >= _fen_tree[right_idx]:
				idx = right_idx
				k -= _fen_tree[idx]
		return idx + 1, k

	def _delete(self, pos, idx):
		"""Delete value at the given `(pos, idx)`."""
		_lists = self._lists
		_mins = self._mins
		_list_lens = self._list_lens

		self._len -= 1
		self._fen_update(pos, -1)
		del _lists[pos][idx]
		_list_lens[pos] -= 1

		if _list_lens[pos]:
			_mins[pos] = _lists[pos][0]
		else:
			del _lists[pos]
			del _list_lens[pos]
			del _mins[pos]
			self._rebuild = True

	def _loc_left(self, value):
		"""Return an index pair that corresponds to the first position of `value` in the sorted list."""
		if not self._len:
			return 0, 0

		_lists = self._lists
		_mins = self._mins

		lo, pos = -1, len(_lists) - 1
		while lo + 1 < pos:
			mi = (lo + pos) >> 1
			if value <= _mins[mi]:
				pos = mi
			else:
				lo = mi

		if pos and value <= _lists[pos - 1][-1]:
			pos -= 1

		_list = _lists[pos]
		lo, idx = -1, len(_list)
		while lo + 1 < idx:
			mi = (lo + idx) >> 1
			if value <= _list[mi]:
				idx = mi
			else:
				lo = mi

		return pos, idx

	def _loc_right(self, value):
		"""Return an index pair that corresponds to the last position of `value` in the sorted list."""
		if not self._len:
			return 0, 0

		_lists = self._lists
		_mins = self._mins

		pos, hi = 0, len(_lists)
		while pos + 1 < hi:
			mi = (pos + hi) >> 1
			if value < _mins[mi]:
				hi = mi
			else:
				pos = mi

		_list = _lists[pos]
		lo, idx = -1, len(_list)
		while lo + 1 < idx:
			mi = (lo + idx) >> 1
			if value < _list[mi]:
				idx = mi
			else:
				lo = mi

		return pos, idx

	def add(self, value):
		"""Add `value` to sorted list."""
		_load = self._load
		_lists = self._lists
		_mins = self._mins
		_list_lens = self._list_lens

		self._len += 1
		if _lists:
			pos, idx = self._loc_right(value)
			self._fen_update(pos, 1)
			_list = _lists[pos]
			_list.insert(idx, value)
			_list_lens[pos] += 1
			_mins[pos] = _list[0]
			if _load + _load < len(_list):
				_lists.insert(pos + 1, _list[_load:])
				_list_lens.insert(pos + 1, len(_list) - _load)
				_mins.insert(pos + 1, _list[_load])
				_list_lens[pos] = _load
				del _list[_load:]
				self._rebuild = True
		else:
			_lists.append([value])
			_mins.append(value)
			_list_lens.append(1)
			self._rebuild = True

	def discard(self, value):
		"""Remove `value` from sorted list if it is a member."""
		_lists = self._lists
		if _lists:
			pos, idx = self._loc_right(value)
			if idx and _lists[pos][idx - 1] == value:
				self._delete(pos, idx - 1)

	def remove(self, value):
		"""Remove `value` from sorted list; `value` must be a member."""
		_len = self._len
		self.discard(value)
		if _len == self._len:
			raise ValueError('{0!r} not in list'.format(value))

	def pop(self, index=-1):
		"""Remove and return value at `index` in sorted list."""
		pos, idx = self._fen_findkth(self._len + index if index < 0 else index)
		value = self._lists[pos][idx]
		self._delete(pos, idx)
		return value

	def bisect_left(self, value):
		"""Return the first index to insert `value` in the sorted list."""
		pos, idx = self._loc_left(value)
		return self._fen_query(pos) + idx

	def bisect_right(self, value):
		"""Return the last index to insert `value` in the sorted list."""
		pos, idx = self._loc_right(value)
		return self._fen_query(pos) + idx

	def count(self, value):
		"""Return number of occurrences of `value` in the sorted list."""
		return self.bisect_right(value) - self.bisect_left(value)

	def __len__(self):
		"""Return the size of the sorted list."""
		return self._len

	def __getitem__(self, index):
		"""Lookup value at `index` in sorted list."""
		pos, idx = self._fen_findkth(self._len + index if index < 0 else index)
		return self._lists[pos][idx]

	def __delitem__(self, index):
		"""Remove value at `index` from sorted list."""
		pos, idx = self._fen_findkth(self._len + index if index < 0 else index)
		self._delete(pos, idx)

	def __contains__(self, value):
		"""Return true if `value` is an element of the sorted list."""
		_lists = self._lists
		if _lists:
			pos, idx = self._loc_left(value)
			return idx < len(_lists[pos]) and _lists[pos][idx] == value
		return False

	def __iter__(self):
		"""Return an iterator over the sorted list."""
		return (value for _list in self._lists for value in _list)

	def __reversed__(self):
		"""Return a reverse iterator over the sorted list."""
		return (value for _list in reversed(self._lists) for value in reversed(_list))

	def __repr__(self):
		"""Return string representation of sorted list."""
		return 'SortedList({0})'.format(list(self))

n,k=rd()
a=list(rd())
st=SortedList([])
cnt=1
ans=[-1]*(n+1)
ind=unsafedict(int)
par=[0]*(n+1)
for i in range(n):
	ind[a[i]]=i
if k==1:
	for i in range(1,n+1):
		print(ind[i]+1)
	exit()
for i in a:
	rr=st.bisect_left((i,-1,-1))
	if rr==len(st):
		par[i]=None
		st.add((i,1,cnt))
	else:
		t=st.pop(rr)
		par[i]=t[0]
		# print(t)
		if t[1]+1==k:
			# print(t)
			ans[i]=cnt
			res=t[0]
			while res!=0:
				# print(res)
				ans[res]=cnt
				res=par[res]
				if res==None:
					break

		else:
			st.add((i,t[1]+1,cnt))
	# t=st
	cnt+=1
# print(par)
print(*ans[1:],sep="\n")

Submission Info

Submission Time
Task D - Draw Your Cards
User randoms
Language PyPy3 (7.3.0)
Score 400
Code Size 8259 Byte
Status AC
Exec Time 887 ms
Memory 137460 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 400 / 400
Status
AC × 3
AC × 53
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt
All sample_01.txt, sample_02.txt, sample_03.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt, test_31.txt, test_32.txt, test_33.txt, test_34.txt, test_35.txt, test_36.txt, test_37.txt, test_38.txt, test_39.txt, test_40.txt, test_41.txt, test_42.txt, test_43.txt, test_44.txt, test_45.txt, test_46.txt, test_47.txt, test_48.txt, test_49.txt, test_50.txt
Case Name Status Exec Time Memory
sample_01.txt AC 707 ms 75636 KiB
sample_02.txt AC 105 ms 75652 KiB
sample_03.txt AC 102 ms 75796 KiB
test_01.txt AC 105 ms 75740 KiB
test_02.txt AC 123 ms 77340 KiB
test_03.txt AC 107 ms 77124 KiB
test_04.txt AC 117 ms 77284 KiB
test_05.txt AC 111 ms 77524 KiB
test_06.txt AC 310 ms 101016 KiB
test_07.txt AC 429 ms 127276 KiB
test_08.txt AC 503 ms 108908 KiB
test_09.txt AC 299 ms 105544 KiB
test_10.txt AC 310 ms 104232 KiB
test_11.txt AC 198 ms 85404 KiB
test_12.txt AC 715 ms 122184 KiB
test_13.txt AC 314 ms 114052 KiB
test_14.txt AC 739 ms 125256 KiB
test_15.txt AC 245 ms 109096 KiB
test_16.txt AC 555 ms 134160 KiB
test_17.txt AC 570 ms 133532 KiB
test_18.txt AC 784 ms 133636 KiB
test_19.txt AC 449 ms 133552 KiB
test_20.txt AC 457 ms 133460 KiB
test_21.txt AC 391 ms 133420 KiB
test_22.txt AC 799 ms 133752 KiB
test_23.txt AC 615 ms 133340 KiB
test_24.txt AC 801 ms 133392 KiB
test_25.txt AC 229 ms 129188 KiB
test_26.txt AC 595 ms 133896 KiB
test_27.txt AC 407 ms 133756 KiB
test_28.txt AC 800 ms 133916 KiB
test_29.txt AC 581 ms 133636 KiB
test_30.txt AC 390 ms 133692 KiB
test_31.txt AC 442 ms 133676 KiB
test_32.txt AC 790 ms 133568 KiB
test_33.txt AC 430 ms 133348 KiB
test_34.txt AC 807 ms 133308 KiB
test_35.txt AC 431 ms 133472 KiB
test_36.txt AC 610 ms 133752 KiB
test_37.txt AC 455 ms 133560 KiB
test_38.txt AC 794 ms 133280 KiB
test_39.txt AC 397 ms 133648 KiB
test_40.txt AC 252 ms 129100 KiB
test_41.txt AC 470 ms 133348 KiB
test_42.txt AC 800 ms 133328 KiB
test_43.txt AC 470 ms 133736 KiB
test_44.txt AC 822 ms 133312 KiB
test_45.txt AC 231 ms 129160 KiB
test_46.txt AC 655 ms 133608 KiB
test_47.txt AC 228 ms 128948 KiB
test_48.txt AC 226 ms 128744 KiB
test_49.txt AC 286 ms 133760 KiB
test_50.txt AC 887 ms 137460 KiB