#include <iostream>#include <cstdlib>#include <set>using namespace std;struct element { int value; //Wert int index; //Index, der sich während des Programms ändert const int start; //Startindex};struct cmp { bool operator()(const struct element *a, const struct element *b) const { if (a->value != b->value) { return a->value < b->value; } else { return a->index < b->index; } }};int main() { int n; cin >> n; while (n != 0) { struct element *nummer = new struct element[n]; //entsprechende viele Elemente erzeugen int pos, dif, sum; struct element max; sum = 0; multiset<struct element *, cmp> zahlen; //um aufs Maximum später schnell zugreifen zu können //einlesen for (int i = 0; i < n; i++) { cin >> nummer[i].value; nummer[i].index = i; nummer[i].start = i; zahlen.insert(&nummer[i]); } multiset<struct element *, cmp>::iterator it; it = zahlen.end(); it--; for (int i = n-1; i >= 0; i--) { //iteriert wird über die Stellen beginnend da, wo das Maximum stehen würde max = **it; it--; pos = max.index; //bestimme aktuelle Position des Maximums dif = i - pos; //Verschiebedistanz ausrechnen sum += dif; //Distanzen aufsummieren for (int j = max.start+1; j < n; j++) { nummer[j].index--; //Indizes der Elemente angleichen, die nach dem Maximum im Feld stehen } } cout << sum << endl; delete [] nummer; cin >> n; } return 0;}