#include <stdio.h> #include <stdlib.h> #define NUM 100000 void merge (int arr[], int sorted[], int l, int m, int r) { int i, j, k; i = l; j = m + 1; k = l; while (i <= m && j <= r ) { if (arr[i] <= arr[j]) sorted[k++] = arr[i++]; else sorted[k++] = arr[j++]; } while (i <= m) sorted[k++] = arr[i++]; while (j <= r) sorted[k++] = arr[j++]; } void merge_pass (int arr[], int sorted[], int len, int n) { int i; for ( i = 0; i <= n - 2 * len; i += 2 * len) merge (arr, sorted, i, i + len - 1, i + 2 * len - 1); if (i + len < n) merge (arr, sorted, i, i + len - 1, n - 1); else for(; i < n; ++i) sorted[i] = arr[i]; } void merge_sort (int arr[], int n) { int len; int *sorted = (int *) malloc (sizeof (int) * n); len = 1; while (len < n) { merge_pass (arr, sorted, len, n); len *= 2; merge_pass (sorted, arr, len, n); len *= 2; } free (sorted); } int resolve (int arr[], int m) { int i, j, last; int sum, num; merge_sort (arr, m); sum = 0; last = 0; j = 0; for (i = 0; i < m; ++i) { arr[i] -= j; if (arr[i] >0) { sum += last * (m - i) + (m - i) * (arr[i] - 1) * (m - i); j += arr[i]; last = m - i; } } return sum; } int main (int argc, char **argv) { int m, n, i; int *arr; scanf ("%d %d", &n, &m); if (n < m || n > NUM) { printf ("Invalid input!/n"); exit (1); } arr = (int *) malloc (sizeof (int) * m); for (i = 0; i < m; ++i) scanf ("%d", arr + i); printf ("%d/n", resolve (arr, m)); exit (0); }