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
76
77
78
79
80
#include <ios>
#include <iostream>
#include <list>
#include <queue>
#include <set>
#include <vector>

int read_int() {
  int x;
  std::cin >> x;
  return x;
}

std::vector<int> read_vec(int n) {
  std::vector<int> v(n);
  for (int i = 0; i < n; ++i) {
    std::cin >> v[i];
  }
  return v;
}

std::vector<std::list<int>> read_graph(int n) {
  const std::vector<int> input = read_vec(n);
  std::vector<std::list<int>> graph(n);

  for (size_t i = 0; i < input.size(); ++i) {
    for (size_t j = i + 1; j < input.size(); ++j) {
      if (input[i] > input[j]) {
        graph[i].push_back(j);
        graph[j].push_back(i);
      }
    }
  }

  return graph;
}

void bfs(const std::vector<std::list<int>> &graph, int v) {
  std::queue<std::pair<int, int>> q;
  int sum = 0;
  std::set<int> visited;

  visited.insert(v);

  for (auto i : graph[v]) {
    q.push(std::make_pair(i, 1));
  }

  while (!q.empty()) {
    auto p = q.front();
    q.pop();

    if (visited.find(p.first) != visited.end()) {
      continue;
    }

    sum += p.second;
    visited.insert(p.first);

    for (auto i : graph[p.first]) {
      q.push(std::make_pair(i, p.second + 1));
    }
  }

  std::cout << sum << " ";
}

int main() {
  std::ios::sync_with_stdio(false);

  const int N = read_int();
  std::vector<std::list<int>> graph = read_graph(N);

  for (int i = 0; i < N; ++i) {
    bfs(graph, i);
  }

  std::cout << std::endl;
  return 0;
}