← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

type Fenwick struct {
	tree []int64
	n    int
}

func NewFenwick(size int) *Fenwick {
	return &Fenwick{tree: make([]int64, size+2), n: size}
}

func (f *Fenwick) update(idx int, val int64) {
	for idx <= f.n {
		f.tree[idx] += val
		idx += idx & -idx
	}
}

func (f *Fenwick) query(idx int) int64 {
	var sum int64 = 0
	for idx > 0 {
		sum += f.tree[idx]
		idx -= idx & -idx
	}
	return sum
}

func main() {
	in := bufio.NewReader(os.Stdin)
	var n int
	fmt.Fscan(in, &n)
	s := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		fmt.Fscan(in, &s[i])
	}
	sumFT := NewFenwick(n)
	countFT := NewFenwick(n)
	for i := 1; i <= n; i++ {
		countFT.update(i, 1)
	}
	p := make([]int, n+1)
	for i := n; i >= 1; i-- {
		low := 1
		high := n
		for low < high {
			mid := (low + high) / 2
			t := int64(mid-1) * int64(mid) / 2
			sumlt := sumFT.query(mid-1)
			gg := t - s[i] - sumlt
			if gg >= 0 {
				high = mid
			} else {
				low = mid + 1
			}
		}
		q0 := low
		low = q0
		high = n
		for low < high {
			mid := (low + high) / 2
			cnt := countFT.query(mid) - countFT.query(q0-1)
			if cnt >= 1 {
				high = mid
			} else {
				low = mid + 1
			}
		}
		r := low
		p[i] = r
		sumFT.update(r, int64(r))
		countFT.update(r, -1)
	}
	for i := 1; i <= n; i++ {
		fmt.Print(p[i])
		if i < n {
			fmt.Print(" ")
		} else {
			fmt.Println()
		}
	}
}