#include <bits/stdc++.h>
using namespace std;
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int dx8[] = {0, 0, 1, 1, 1, -1, -1, -1};
int dy8[] = {1, -1, -1, 0, 1, -1, 0, 1};
long long tree[2 * 100010], n;
long long a[100005 * 2];
void update(long long idx, long long val) {
  while (idx <= n) {
    tree[idx] += val;
    idx += idx & (-idx);
  }
}
long long query(long long idx) {
  long long sum = 0;
  while (idx > 0) {
    sum += tree[idx];
    idx -= idx & (-idx);
  }
  return sum;
}
struct data {
  long long l, r, k, id, res;
};
bool cmp(data a, data b) { return (a.r > b.r); }
bool cmp1(data a, data b) { return (a.l > b.l); }
data d[2 * 100005];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  long long k = 0;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    a[i] = min(n, a[i]);
    if (a[i] > i) {
      d[k].l = i + 1;
      d[k].r = a[i];
      d[k].k = i;
      k++;
    }
    update(a[i], 1);
  }
  sort(d, d + k, cmp);
  long long id = n, x, y;
  for (int i = 0; i < (k); i++) {
    while (id > 0 && d[i].r < id) {
      update(a[id], -1);
      id--;
    }
    x = query(n);
    y = query(d[i].k - 1);
    d[i].res = x - y;
  }
  memset((tree), 0, sizeof(tree));
  for (int i = 0; i < (n); i++) {
    update(a[i + 1], 1);
  }
  sort(d, d + k, cmp1);
  long long sum = 0;
  id = n;
  for (int i = 0; i < (k); i++) {
    while (id > 0 && d[i].l <= id) {
      update(a[id], -1);
      id--;
    }
    y = query(d[i].k - 1);
    x = query(n);
    d[i].res -= (x - y);
    sum += d[i].res;
  }
  cout << sum << endl;
  return 0;
}
