塑料因为滥用 partition_point
被打入了二分炼狱,橘猫大人给他分配的第一个工作是 “给定一个正整数序列,询问下标查找右边第一个比它大/小的数字”。
“这不是我们 2023 新生月赛的题目吗,下次记得标明出处”,塑料洋洋洒洒地写了个线段树上二分(尽管这次并不需要修改)交了上去。
然而没过几天,橘猫发现塑料的代码出锅了。愤怒的橘猫给塑料发布了他的第二个工作:
定义一个函数 ,它的工作方式是按顺序执行
初始时,下标 ,
, 所求和
。
找到 右边第一个
,使得
,令
增加
,
修改为
;
若找不到,返回 sum,结束。
找到 右边第一个
,使得
,令
增加
,
修改为
;
若找不到,返回 sum,结束。
重新回到第 2 步。
塑料随便一想就想出了 的求法,然而橘猫大人让塑料别得意得太早,因为他希望对于每一个
(
) 都要求出
的值。
汗流浃背的塑料发现时限只有 1ms,他找到了v2x1求他帮忙卡卡常数。v2x1一边流汗一边跟橘猫商量,最后橘猫同意塑料只需要在两秒内搞定。
然而就算如此塑料还是不会做,所以他来找你了,请你帮帮他吧。
第一行输入一个正整数
![]()
接下来输入
个正整数
![]()
,表示塑料需要处理的序列。
设
为第
个元素带入
的返回值,你需要输出一个长度为
的正整数序列
,元素之间用空格隔开。
样例解释:
对于第一个元素,第一个比它大的数是
,而之后就没有比
小的数字了,所以
。
对于第三个元素,第一个比它大的数是
,接下来比它小的第一个数字是
,所以
。