最少逆序对数
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

对于一次操作,我们定义为把数组a的第一个元素移动到数组的末端,即原来的 [a_1,a_2,...,a_n]变为 [a_2,a_3,...a_n,a_1]

定义 f(a) 表示对数组a进行任意次操作后得到的数组a的最少逆序对数量。

现在给定一个数组 b,你需要对数组 b 的每个前缀 p 求出 f(p),每个前缀单独询问,互不影响。

逆序对:在一个有 n 个元素的数组 A 中,如果存在 1\leq i<j\leq n ,使得 A_i>A_j ,则称 (A_i,A_j)A 的一个逆序对。

输入描述:

第一行包含一个整数 n(2\leq n\leq 2\times 10^4),表示数组b的长度。

第二行包含 n 个整数,第 i 个数为 b_i(1\leq b_i\leq n),表示数组b中的元素。

输出描述:

输出共n个整数,表示数组b中的每个前缀的f(p),每个数之间用空格隔开。
示例1

输入

复制
4
2 3 1 4

输出

复制
0 0 0 2