#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1.0);
const int N = 1e5 + 7;
struct seg {
  int l, mid, r;
  int Min, pos;
};
seg T[N << 2];
int bit[N], arr[N];
void init() { memset(bit, 0, sizeof(bit)); }
void pushup(int k) {
  if (T[(k << 1)].Min <= T[((k << 1) + 1)].Min)
    T[k].pos = T[(k << 1)].pos;
  else
    T[k].pos = T[((k << 1) + 1)].pos;
  T[k].Min = min(T[(k << 1)].Min, T[((k << 1) + 1)].Min);
}
void build(int k, int l, int r) {
  T[k].l = l;
  T[k].r = r;
  T[k].mid = ((l + r) >> 1);
  if (l == r)
    T[k].Min = 0x3f3f3f3f, T[k].pos = l;
  else {
    build((k << 1), l, T[k].mid);
    build(((k << 1) + 1), T[k].mid + 1, r);
    pushup(k);
  }
}
void add(int k, int v) {
  while (k < N) {
    bit[k] += v;
    k += (k & -k);
  }
}
int getsum(int k) {
  int ret = 0;
  while (k) {
    ret += bit[k];
    k -= (k & -k);
  }
  return ret;
}
int getquery(int l, int r) { return getsum(r) - getsum(l - 1); }
pair<int, int> query(int k, int l, int r) {
  if (l <= T[k].l && T[k].r <= r)
    return pair<int, int>(T[k].Min, T[k].pos);
  else {
    if (r <= T[k].mid)
      return query((k << 1), l, r);
    else if (l > T[k].mid)
      return query(((k << 1) + 1), l, r);
    else {
      pair<int, int> ll = query((k << 1), l, T[k].mid);
      pair<int, int> rr = query(((k << 1) + 1), T[k].mid + 1, r);
      if (ll.first <= rr.first)
        return ll;
      else
        return rr;
    }
  }
}
void update(int k, int pos, int v) {
  if (T[k].l == T[k].r)
    T[k].Min = v;
  else {
    if (pos <= T[k].mid)
      update((k << 1), pos, v);
    else
      update(((k << 1) + 1), pos, v);
    pushup(k);
  }
}
int main(void) {
  int n, i;
  while (~scanf("%d", &n)) {
    init();
    build(1, 1, n);
    for (i = 1; i <= n; ++i) {
      scanf("%d", &arr[i]);
      update(1, i, arr[i]);
      add(i, 1);
    }
    long long ans = 0LL;
    int use = 0, last = 0;
    last = 1;
    while (use < n) {
      pair<int, int> Min = query(1, last, n);
      pair<int, int> Amin = query(1, 1, n);
      if (Min.first == Amin.first) {
        ans += (long long)getquery(last, Min.second);
        add(Min.second, -1);
        update(1, Min.second, 0x3f3f3f3f);
        last = Min.second;
        ++use;
      } else {
        ans += (long long)getquery(1, Amin.second);
        ans += (long long)getquery(last, n);
        update(1, Amin.second, 0x3f3f3f3f);
        add(Amin.second, -1);
        last = Amin.second;
        ++use;
      }
    }
    printf("%I64d\n", ans);
  }
  return 0;
}
