← Home
```go
package main

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

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	var t int
	fmt.Fscan(in, &t)
	const N = 200010
	for i := 0; i < t; i++ {
		var n int
		fmt.Fscan(in, &n)
		a := make([]int, n)
		for i := 0; i < n; i++ {
			fmt.Fscan(in, &a[i])
		}
		S := make([]int64, n+1)
		for i := 1; i <= n; i++ {
			S[i] = S[i-1] + int64(a[i-1])
		}
		freq := NewFenwick(N)
		sumv := NewFenwick(N)
		seg := NewSegTree(N)
		ans := make([]int64, 0, n)
		for k := 1; k <= n; k++ {
			aa := a[k-1]
			if aa > 0 {
				freq.Update(aa, 1)
				sumv.Update(aa, int64(aa))
				seg.UpdateRange(1, 1, N, 1, aa, 1)
			}
			mm := seg.QueryMin(1, 1, N, 1, N)
			m := int(mm)
			r := k - m
			if r < 0 {
				r = 0
			}
			var sumExtra int64
			if r > 0 {
				low := 1
				high := N
				for low < high {
					mid := (low + high) / 2
					if freq.Query(mid) >= int64(r) {
						high = mid
					} else {
						low = mid + 1
					}
				}
				v := low
				var cc int64
				if v-1 >= 1 {
					cc = freq.Query(v-1)
				}
				var ss int64
				if v-1 >= 1 {
					ss = sumv.Query(v-1)
				}
				sumExtra = ss + (int64(r)-cc)*int64(v)
			}
			save := int64(m)*(int64(m)+1)/2 + sumExtra
			ans = append(ans, S[k]-save)
		}
		for i, v := range ans {
			if i > 0 {
				fmt.Fprint(out, " ")
			}
			fmt.Fprint(out, v)
		}
		fmt.Fprintln(out)
	}
}

type Fenwick struct {
	data []int64
}

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

func (f *Fenwick) Update(idx int, val int64) {
	for idx < len(f.data) {
		f.data[idx] += val
		idx += idx & -idx
	}
}

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

type SegNode struct {
	minVal, lazy int64
}

type SegTree struct {
	tree []SegNode
	size int
}

func NewSegTree(size int) *SegTree {
	t := &SegTree{
		tree: make([]SegNode, 4*(size+1)),
		size: size,
	}
	t.build(1, 1, size)
	return t
}

func (t *SegTree) build(node, start, end int) {
	if start == end {
		t.tree[node].minVal = int64(start - 1)
		return
	}
	mid := (start + end) / 2
	t.build(2*node, start, mid)
	t.build(2*node+1, mid+1, end)
	t.tree[node].minVal = tmin(t.tree[2*node].minVal, t.tree[2*node+1].minVal)
}

func tmin(a, b int64) int64 {
	if a < b {
		return a
	}
	return b
}

func (t *SegTree) push(node, start, end int) {
	if t.tree[node].lazy != 0 {
		t.tree[node].minVal += t.tree[node].lazy
		if start != end {
			t.tree[2*node].lazy += t.tree[node].lazy
			t.tree[2*node+1].lazy += t.tree[node].lazy
		}
		t.tree[node].lazy = 0
	}
}

func (t *SegTree) UpdateRange(node, start, end, l, r int, val int64) {
	t.push(node, start, end)
	if start > end || start > r || end < l {
		return
	}
	if l <= start && end <= r {
		t.tree[node].lazy += val
		t.push(node, start, end)
		return
	}
	mid := (start + end) / 2
	t.UpdateRange(2*node, start, mid, l, r, val)
	t.UpdateRange(2*node+1, mid+1, end, l, r, val)
	t.tree[node].minVal = tmin(t.tree[2*node].minVal, t.tree[2*node+1].minVal)
}

func (t *SegTree) QueryMin(node, start, end, l, r int) int64 {
	t.push(node, start, end)
	if start > end || start > r || end < l {
		return 1 << 60
	}
	if l <= start && end <= r {
		return t.tree[node].minVal
	}
	mid := (start + end) / 2
	left := t.QueryMin(2*node, start, mid, l, r)
	right := t.QueryMin(2*node+1, mid+1, end, l, r)
	return tmin(left, right)
}
```