1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include<cstdio>
#include<queue>

using namespace std;

#define N 200005

int dane[N];
bool odwiedzone[N];

vector<int> krawedzie[N];

bool krawedz(int i, int j) {
	if (i < j) {
		return dane[i] > dane[j];
	} else if (i > j) {
		return dane[j] > dane[i];
	}

	return false;
}

void clear(int n) {
	for (int i = 1; i <= n; i++) {
		odwiedzone[i] = false;
	}
}



int main() {
	int n;
	scanf("%d\n", &n);

	for (int i = 1; i <= n; i++) {
		scanf("%d", &dane[i]);
	}

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (krawedz(i, j)) {
				//printf("%d %d\n", i, j);
				krawedzie[i].push_back(j);
			}
		}
	}

	for (int i = 1; i <= n; i++) {
		clear(n);
		long long result = 0;

		queue<pair<int, long long>> kolejka;
		kolejka.push(make_pair(i, 0));
		odwiedzone[i] = true;

		while (! kolejka.empty()) {
			pair<int, long long> wierzcholek = kolejka.front();
			kolejka.pop();
			result += wierzcholek.second;
			int size = krawedzie[wierzcholek.first].size();
			for (int e = 0; e < size; e++) {
				int nowyWierzcholek = krawedzie[wierzcholek.first][e];
				if (! odwiedzone[nowyWierzcholek]) {
					odwiedzone[nowyWierzcholek] = true;
					kolejka.push(make_pair(nowyWierzcholek, wierzcholek.second + 1));
				}
			}
		}

		printf("%lld ", result);
	}
	printf("\n");

	return 0;
}