Problem:
Score : 700 points

Problem Statement

Snuke loves constructing integer sequences.

There are N piles of stones, numbered 1 through N.
The pile numbered i consists of a_i stones.

Snuke will construct an integer sequence s of length Σa_i, as follows:

Among the piles with the largest number of stones remaining, let x be the index of the pile with the smallest index. Append x to the end of s.

Select a pile with one or more stones remaining, and remove a stone from that pile.

If there is a pile with one or more stones remaining, go back to step 1. Otherwise, terminate the process.

We are interested in the lexicographically smallest sequence that can be constructed. For each of the integers 1,2,3,...,N, how many times does it occur in the lexicographically smallest sequence?

Constraints

1 ≤ N ≤ 10^{5}

1 ≤ a_i ≤ 10^{9}

Input

The input is given from Standard Input in the following format:

N
a_1 a_2 ... a_{N}

Output

Print N lines. The i-th line should contain the number of the occurrences of the integer i in the lexicographically smallest sequence that can be constructed.

Sample Input 1

2
1 2

Sample Output 1

2
1

The lexicographically smallest sequence is constructed as follows:

Since the pile with the largest number of stones remaining is pile 2, append 2 to the end of s. Then, remove a stone from pile 2.

Since the piles with the largest number of stones remaining are pile 1 and 2, append 1 to the end of s (we take the smallest index). Then, remove a stone from pile 2.

Since the pile with the largest number of stones remaining is pile 1, append 1 to the end of s. Then, remove a stone from pile 1.

The resulting sequence is (2,1,1). In this sequence, 1 occurs twice, and 2 occurs once.

Sample Input 2

10
1 2 1 3 2 4 2 5 8 1

Sample Output 2

10
7
0
4
0
3
0
2
3
0

Solution in Rust (1.42.0) (judge verdict: Wrong Answer)

#![allow(unused_parens)]
#![allow(unused_imports)]
#![allow(non_upper_case_globals)]
#![allow(non_snake_case)]
#![allow(unused_mut)]
#![allow(unused_variables)]
#![allow(dead_code)]

use itertools::Itertools;
use proconio::input;
use proconio::marker::{Chars, Usize1};

#[allow(unused_macros)]
#[cfg(debug_assertions)]
macro_rules! mydbg {
    //($arg:expr) => (dbg!($arg))
    //($arg:expr) => (println!("{:?}",$arg));
      ($($a:expr),*) => {
          eprintln!(concat!($(stringify!($a), " = {:?}, "),*), $($a),*);
      }
}
#[cfg(not(debug_assertions))]
macro_rules! mydbg {
    ($($arg:expr),*) => {};
}

macro_rules! echo {
    ($($a:expr),*) => {
          $(println!("{}",$a))*
      }
}

use std::cmp::*;
use std::collections::*;
use std::ops::{Add, Div, Mul, Sub};

#[allow(dead_code)]
static INF_I64: i64 = 92233720368547758;
#[allow(dead_code)]
static INF_I32: i32 = 21474836;
#[allow(dead_code)]
static INF_USIZE: usize = 18446744073709551;
#[allow(dead_code)]
static M_O_D: usize = 1000000007;
#[allow(dead_code)]
static PAI: f64 = 3.1415926535897932;

trait IteratorExt: Iterator {
    fn toVec(self) -> Vec<Self::Item>;
}

impl<T: Iterator> IteratorExt for T {
    fn toVec(self) -> Vec<Self::Item> {
        self.collect()
    }
}

trait CharExt {
    fn toNum(&self) -> usize;
    fn toAlphabetIndex(&self) -> usize;
    fn toNumIndex(&self) -> usize;
}
impl CharExt for char {
    fn toNum(&self) -> usize {
        return *self as usize;
    }
    fn toAlphabetIndex(&self) -> usize {
        return self.toNum() - 'a' as usize;
    }
    fn toNumIndex(&self) -> usize {
        return self.toNum() - '0' as usize;
    }
}

trait VectorExt {
    fn joinToString(&self, s: &str) -> String;
}
impl<T: ToString> VectorExt for Vec<T> {
    fn joinToString(&self, s: &str) -> String {
        return self
            .iter()
            .map(|x| x.to_string())
            .collect::<Vec<_>>()
            .join(s);
    }
}

trait StringExt {
    fn get_reverse(&self) -> String;
}
impl StringExt for String {
    fn get_reverse(&self) -> String {
        self.chars().rev().collect::<String>()
    }
}

trait UsizeExt {
    fn pow(&self, n: usize) -> usize;
}
impl UsizeExt for usize {
    fn pow(&self, n: usize) -> usize {
        return ((*self as u64).pow(n as u32)) as usize;
    }
}
pub trait Monoid {
    type T: Clone;
    fn id() -> Self::T;
    fn op(a: &Self::T, b: &Self::T) -> Self::T;
}
pub struct SegTree<M: Monoid> {
    n: usize,
    data: Vec<M::T>,
}
impl<M: Monoid> SegTree<M> {
    pub fn new(n_: usize) -> SegTree<M> {
        let mut n = 1 as usize;
        while (n < n_) {
            n *= 2;
        }
        SegTree {
            n: n,
            data: vec![M::id().clone(); (2 * n)],
        }
    }
    #[macro_use]
    pub fn update(&mut self, index: usize, v: M::T) {
        let mut k = index + self.n - 1;
        self.data[k] = v;
        while (k > 0) {
            k = (k - 1) / 2;
            self.data[k] = M::op(&self.data[2 * k + 1], &self.data[2 * k + 2]);
        }
    }
    pub fn query(&mut self, l: usize, r: usize) -> M::T {
        let mut l = l + self.n - 1;
        let mut r = r + self.n - 1;
        if (l == r) {
            return M::op(&M::id().clone(), &self.data[l]);
        }
        let mut ret = M::id().clone();
        while (l < r) {
            if (l % 2 == 0) {
                ret = M::op(&ret, &self.data[l]);
            }
            if (r % 2 == 0) {
                ret = M::op(&ret, &self.data[r - 1]);
            }
            l = l / 2;
            r = (r - 1) / 2;
        }
        return ret;
    }
}
struct SUM;
impl Monoid for SUM {
    type T = u64;
    fn id() -> Self::T {
        0
    }
    fn op(a: &Self::T, b: &Self::T) -> Self::T {
        *a + *b
    }
}

fn main() {
    input! {
       N: usize,
       mut A:[usize;N],
    }
    if N == 1 {
        echo!(A[0]);
        return;
    }

    let mut s = HashMap::new();
    let mut used = HashSet::new();
    let mut st: SegTree<SUM> = SegTree::new(N);
    let mut m = 0;
    let mut index = 0;
    for i in 0..N {
        st.update(i, 1);
        let mut hp = s.entry(A[i]).or_insert(vec![]);
        hp.push(i);
        if m < A[i] {
            m = A[i];
            index = i;
        }
    }
    mydbg!(s);

    let mut ans = vec![];
    for i in 0..N {
        if used.contains(&A[i]) {
            ans.push(0);
            continue;
        }
        if let Some(v) = s.get(&A[i]) {
            mydbg!(v);
            let count = st.query(i, N);
            ans.push(count);
            for &item in v {
                st.update(item, 0);
            }
        }
        used.insert(A[i]);
    }
    A.sort();
    A.reverse();
    ans[index] = (m - A[1]) as u64;

    echo!(ans.joinToString("\n"));
}