社区的python题解太少了,不知道有没有大佬愿意调一下,后面#14就开始TLS了,我太弱了
# 读取数组数量n, 操作数k
n, k = [int(i) for i in input().split()]
a = [int(i) for i in input().split()]
# sorted_a: m*2 list, a[i][1]为数组a索引为a[i][0]时的值
sorted_a = [[i[0]+1, i[1]] for i in sorted(enumerate(a), key=lambda x: x[1])]
# 判断a[i]和a[j]关于value的排序关系
def is_righter_item(item1, item2):
if item1[1] == item2[1]:
return item1[0] > item2[0]
else:
return item1[1] > item2[1]
for i in range(k):
op = input().split()
# 第一种操作
if op[0] == "1":
# 判断是否改的值与原值相同
is_same = False
# 查找修改项,最坏情况o(n)
for item in sorted_a:
if item[0] == int(op[1]):
if int(op[2]) == item[1]:
is_same = True
else:
# 修改值并remove
item[1] = int(op[2])
sorted_a.remove(item)
break
# 等于没动,不操作
if is_same:
continue
# 判断区间端点情况
if not is_righter_item(item, sorted_a[0]):
sorted_a = [item] + sorted_a
elif is_righter_item(item, sorted_a[-1]):
sorted_a += [item]
# 满足sort_a[0] < item < sort_a[-1], 二分法求插入索引, o(logn)
else:
start, end = 0, len(sorted_a)-1
while end - start > 1:
middle = (start + end) // 2
if is_righter_item(item, sorted_a[middle]):
start = middle
else:
end = middle
sorted_a.insert(end, item)
elif op[0] == "2":
# 查找满足项,最坏情况o(n)
for item in sorted_a:
if item[0] == int(op[1]):
print(sorted_a.index(item)+1)
break