#include <bits/stdc++.h>
int n, m, a[35010], last[35010], next[35010], dp[35010][60], sz, add[160000],
    max[160000];
void update(int p, int q, int val, int k, int l, int r);
void query(int p, int q, int k, int l, int r, int a, int *ans);
void maintain(int k);
int main(void) {
  scanf("%d%d", &n, &m);
  int i, j;
  for (i = 1; i <= n; i++) scanf("%d", &a[i]);
  memset(last, 0, sizeof(last));
  for (i = n; i >= 1; i--) {
    next[i] = last[a[i]] ? last[a[i]] : n + 1;
    last[a[i]] = i;
  }
  for (i = 0; i <= n; i++) dp[0][i] = i < n ? -10000000 : 0;
  for (sz = 1; sz < n; sz *= 2)
    ;
  for (i = 1; i <= m; i++) {
    memset(max, 0, sizeof(max));
    memset(add, 0, sizeof(add));
    for (j = n - i; j >= 0; j--) {
      update(j + 1, j + 1, dp[i - 1][j + 1], 1, 1, sz);
      update(j + 1, next[j + 1] - 1, 1, 1, 1, sz);
      dp[i][j] = 0;
      query(j + 1, n - i + 1, 1, 1, sz, 0, &dp[i][j]);
    }
  }
  printf("%d\n", dp[m][0]);
  return 0;
}
void update(int p, int q, int val, int k, int l, int r) {
  if (p <= l && q >= r) {
    add[k] += val;
    maintain(k);
    return;
  }
  int m = (l + r) / 2;
  if (p <= m) update(p, q, val, k * 2, l, m);
  if (q > m) update(p, q, val, k * 2 + 1, m + 1, r);
  maintain(k);
}
void query(int p, int q, int k, int l, int r, int a, int *ans) {
  if (p <= l && q >= r) {
    *ans = ((*ans) > (max[k] + a) ? (*ans) : (max[k] + a));
    return;
  }
  int m = (l + r) / 2;
  if (p <= m) query(p, q, k * 2, l, m, a + add[k], ans);
  if (q > m) query(p, q, k * 2 + 1, m + 1, r, a + add[k], ans);
}
void maintain(int k) {
  if (k * 2 > sz * 2 - 1)
    max[k] = add[k];
  else
    max[k] =
        ((max[k * 2]) > (max[k * 2 + 1]) ? (max[k * 2]) : (max[k * 2 + 1])) +
        add[k];
}
