#include<bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; i++)
#define FORD(i, b, a) for (int i = (b), _a = (a); i >= _a; i--)
#define REP(i, n) for (int i = 0, _n = (n); i < _n; i++)
#define ALL(v) (v).begin(), (v).end()
#define fi first
#define se second
#define MASK(i) (1LL << (i))
#define BIT(x, i) (((x) >> (i)) & 1)
template<class X, class Y>
bool minimize(X &x, const Y &y) {
if (x > y) {
x = y;
return true;
} else return false;
}
template<class X, class Y>
bool maximize(X &x, const Y &y) {
if (x < y) {
x = y;
return true;
} else return false;
}
struct SegmentTree {
vector<int> minValue, minCount, lazy;
int n;
void build(int i, int l, int r) {
minCount[i] = r - l + 1;
if (l == r) return;
int m = (l + r) >> 1;
build(2 * i, l, m);
build(2 * i + 1, m + 1, r);
}
SegmentTree(int _n = 0) {
n = _n;
minValue.assign(4 * n + 7, 0);
minCount.assign(4 * n + 7, 0);
lazy.assign(4 * n + 7, 0);
build(1, 1, n);
}
void pushDown(int i) {
if (lazy[i] == 0) return;
FOR(j, 2 * i, 2 * i + 1) {
minValue[j] += lazy[i];
lazy[j] += lazy[i];
}
lazy[i] = 0;
}
void update(int i, int l, int r, int u, int v, int c) {
if (l > v || r < u || l > r || v < u) return;
if (u <= l && r <= v) {
minValue[i] += c;
lazy[i] += c;
return;
}
pushDown(i);
int m = (l + r) >> 1;
update(2 * i, l, m, u, v, c);
update(2 * i + 1, m + 1, r, u, v, c);
minValue[i] = min(minValue[2 * i], minValue[2 * i + 1]);
minCount[i] = (minValue[2 * i] == minValue[i] ? minCount[2 * i] : 0) + (minValue[2 * i + 1] == minValue[i] ? minCount[2 * i + 1] : 0);
}
void update(int l, int r, int c) {
update(1, 1, n, l, r, c);
}
int getNumZero(void) const {
return minValue[1] == 0 ? minCount[1] : 0;
}
};
struct Update {
int fr, to, delta;
Update(int _fr = 0, int _to = 0, int _delta = 0) {
fr = _fr; to = _to; delta = _delta;
}
};
#define MAX 100100
int n, m, a[MAX];
void init(void) {
scanf("%d%d", &n, &m);
FOR(i, 1, n) scanf("%d", &a[i]);
}
namespace subtask1 {
int cnt[MAX], cntOfCnt[MAX];
bool check(void) {
return n <= 1000;
}
void process(void) {
int res = 0;
FOR(l, 1, n) {
memset(cnt, 0, (n + 1) * sizeof (int));
memset(cntOfCnt, 0, (n + 1) * sizeof (int));
cntOfCnt[0] = n;
FOR(r, l, n) {
cntOfCnt[cnt[a[r]]]--;
cnt[a[r]]++;
cntOfCnt[cnt[a[r]]]++;
bool ok = true;
FOR(i, 1, m) if (cntOfCnt[i] == 0) ok = false;
if (ok) res++;
}
}
printf("%d\n", res);
}
}
namespace subtask2 {
bool check(void) {
FOR(i, 1, n) if (a[i] > m) return false;
return true;
}
int cnt[10], have[10];
void process(void) {
int res = 0;
FOR(i, 1, n) if (i + m * (m + 1) / 2 - 1 <= n) {
int j = i + m * (m + 1) / 2 - 1;
memset(cnt, 0, sizeof cnt);
memset(have, 0, sizeof have);
FOR(k, i, j) cnt[a[k]]++;
FOR(k, 1, m) have[cnt[k]]++;
bool ok = true;
FOR(k, 1, m) if (have[k] == 0) ok = false;
if (ok) res++;
}
printf("%d\n", res);
}
}
namespace subtask4 {
bool check(void) {
return true;
}
vector<int> pos[MAX];
vector<Update> updates[5][MAX];
void addRectangle(int id, int minX, int maxX, int minY, int maxY) {
updates[id][minX].push_back(Update(minY, maxY, +1));
updates[id][maxX + 1].push_back(Update(minY, maxY, -1));
}
void prepare(void) {
FOR(i, 1, n) pos[a[i]].push_back(i);
FOR(i, 1, n) {
vector<int> &v = pos[i];
v.insert(v.begin(), 0);
v.push_back(n + 1);
FOR(j, 1, v.size() - 2) REP(k, m) if (j + k <= (int)v.size() - 2)
addRectangle(k + 1, v[j - 1] + 1, v[j], v[j + k], v[j + k + 1] - 1);
}
}
long long countNumber(int mask) {
SegmentTree myit(n);
long long res = 0;
FOR(i, 1, n) {
FOR(j, 1, m) if (BIT(mask, j - 1)) {
for (const Update &u : updates[j][i]) myit.update(u.fr, u.to, u.delta);
}
res += myit.getNumZero();
}
return res - 1LL * n * (n - 1) / 2;
}
void process(void) {
prepare();
long long res = 1LL * n * (n + 1) / 2;
FOR(mask, 1, MASK(m) - 1) {
long long tmp = countNumber(mask);
if (__builtin_popcount(mask) % 2 == 0) res += tmp;
else res -= tmp;
}
cout << res << "\n";
}
}
int main(void) {
init();
if (subtask1::check()) return subtask1::process(), 0;
if (subtask2::check()) return subtask2::process(), 0;
if (subtask4::check()) return subtask4::process(), 0;
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgRk9SKGksIGEsIGIpIGZvciAoaW50IGkgPSAoYSksIF9iID0gKGIpOyBpIDw9IF9iOyBpKyspCiNkZWZpbmUgRk9SRChpLCBiLCBhKSBmb3IgKGludCBpID0gKGIpLCBfYSA9IChhKTsgaSA+PSBfYTsgaS0tKQojZGVmaW5lIFJFUChpLCBuKSBmb3IgKGludCBpID0gMCwgX24gPSAobik7IGkgPCBfbjsgaSsrKQoKI2RlZmluZSBBTEwodikgICAodikuYmVnaW4oKSwgKHYpLmVuZCgpCiNkZWZpbmUgZmkgICBmaXJzdAojZGVmaW5lIHNlICAgc2Vjb25kCgojZGVmaW5lIE1BU0soaSkgKDFMTCA8PCAoaSkpCiNkZWZpbmUgQklUKHgsIGkpICgoKHgpID4+IChpKSkgJiAxKQoKdGVtcGxhdGU8Y2xhc3MgWCwgY2xhc3MgWT4KICAgIGJvb2wgbWluaW1pemUoWCAmeCwgY29uc3QgWSAmeSkgewogICAgICAgIGlmICh4ID4geSkgewogICAgICAgICAgICB4ID0geTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHJldHVybiBmYWxzZTsKICAgIH0KCnRlbXBsYXRlPGNsYXNzIFgsIGNsYXNzIFk+CiAgICBib29sIG1heGltaXplKFggJngsIGNvbnN0IFkgJnkpIHsKICAgICAgICBpZiAoeCA8IHkpIHsKICAgICAgICAgICAgeCA9IHk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSByZXR1cm4gZmFsc2U7CiAgICB9CgpzdHJ1Y3QgU2VnbWVudFRyZWUgewogICAgdmVjdG9yPGludD4gbWluVmFsdWUsIG1pbkNvdW50LCBsYXp5OwogICAgaW50IG47CgogICAgdm9pZCBidWlsZChpbnQgaSwgaW50IGwsIGludCByKSB7CiAgICAgICAgbWluQ291bnRbaV0gPSByIC0gbCArIDE7CiAgICAgICAgaWYgKGwgPT0gcikgcmV0dXJuOwogICAgICAgIGludCBtID0gKGwgKyByKSA+PiAxOwogICAgICAgIGJ1aWxkKDIgKiBpLCBsLCBtKTsKICAgICAgICBidWlsZCgyICogaSArIDEsIG0gKyAxLCByKTsKICAgIH0KCiAgICBTZWdtZW50VHJlZShpbnQgX24gPSAwKSB7CiAgICAgICAgbiA9IF9uOwogICAgICAgIG1pblZhbHVlLmFzc2lnbig0ICogbiArIDcsIDApOwogICAgICAgIG1pbkNvdW50LmFzc2lnbig0ICogbiArIDcsIDApOwogICAgICAgIGxhenkuYXNzaWduKDQgKiBuICsgNywgMCk7CiAgICAgICAgYnVpbGQoMSwgMSwgbik7CiAgICB9CgogICAgdm9pZCBwdXNoRG93bihpbnQgaSkgewogICAgICAgIGlmIChsYXp5W2ldID09IDApIHJldHVybjsKICAgICAgICBGT1IoaiwgMiAqIGksIDIgKiBpICsgMSkgewogICAgICAgICAgICBtaW5WYWx1ZVtqXSArPSBsYXp5W2ldOwogICAgICAgICAgICBsYXp5W2pdICs9IGxhenlbaV07CiAgICAgICAgfQogICAgICAgIGxhenlbaV0gPSAwOwogICAgfQoKICAgIHZvaWQgdXBkYXRlKGludCBpLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdiwgaW50IGMpIHsKICAgICAgICBpZiAobCA+IHYgfHwgciA8IHUgfHwgbCA+IHIgfHwgdiA8IHUpIHJldHVybjsKICAgICAgICBpZiAodSA8PSBsICYmIHIgPD0gdikgewogICAgICAgICAgICBtaW5WYWx1ZVtpXSArPSBjOwogICAgICAgICAgICBsYXp5W2ldICs9IGM7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHB1c2hEb3duKGkpOwogICAgICAgIGludCBtID0gKGwgKyByKSA+PiAxOwogICAgICAgIHVwZGF0ZSgyICogaSwgbCwgbSwgdSwgdiwgYyk7CiAgICAgICAgdXBkYXRlKDIgKiBpICsgMSwgbSArIDEsIHIsIHUsIHYsIGMpOwogICAgICAgIG1pblZhbHVlW2ldID0gbWluKG1pblZhbHVlWzIgKiBpXSwgbWluVmFsdWVbMiAqIGkgKyAxXSk7CiAgICAgICAgbWluQ291bnRbaV0gPSAobWluVmFsdWVbMiAqIGldID09IG1pblZhbHVlW2ldID8gbWluQ291bnRbMiAqIGldIDogMCkgKyAobWluVmFsdWVbMiAqIGkgKyAxXSA9PSBtaW5WYWx1ZVtpXSA/IG1pbkNvdW50WzIgKiBpICsgMV0gOiAwKTsKICAgIH0KCiAgICB2b2lkIHVwZGF0ZShpbnQgbCwgaW50IHIsIGludCBjKSB7CiAgICAgICAgdXBkYXRlKDEsIDEsIG4sIGwsIHIsIGMpOwogICAgfQoKICAgIGludCBnZXROdW1aZXJvKHZvaWQpIGNvbnN0IHsKICAgICAgICByZXR1cm4gbWluVmFsdWVbMV0gPT0gMCA/IG1pbkNvdW50WzFdIDogMDsKICAgIH0KfTsKCnN0cnVjdCBVcGRhdGUgewogICAgaW50IGZyLCB0bywgZGVsdGE7CgogICAgVXBkYXRlKGludCBfZnIgPSAwLCBpbnQgX3RvID0gMCwgaW50IF9kZWx0YSA9IDApIHsKICAgICAgICBmciA9IF9mcjsgdG8gPSBfdG87IGRlbHRhID0gX2RlbHRhOwogICAgfQp9OwoKI2RlZmluZSBNQVggICAxMDAxMDAKaW50IG4sIG0sIGFbTUFYXTsKCnZvaWQgaW5pdCh2b2lkKSB7CiAgICBzY2FuZigiJWQlZCIsICZuLCAmbSk7CiAgICBGT1IoaSwgMSwgbikgc2NhbmYoIiVkIiwgJmFbaV0pOwp9CgpuYW1lc3BhY2Ugc3VidGFzazEgewogICAgaW50IGNudFtNQVhdLCBjbnRPZkNudFtNQVhdOwoKICAgIGJvb2wgY2hlY2sodm9pZCkgewogICAgICAgIHJldHVybiBuIDw9IDEwMDA7CiAgICB9CgogICAgdm9pZCBwcm9jZXNzKHZvaWQpIHsKICAgICAgICBpbnQgcmVzID0gMDsKICAgICAgICBGT1IobCwgMSwgbikgewogICAgICAgICAgICBtZW1zZXQoY250LCAwLCAobiArIDEpICogc2l6ZW9mIChpbnQpKTsKICAgICAgICAgICAgbWVtc2V0KGNudE9mQ250LCAwLCAobiArIDEpICogc2l6ZW9mIChpbnQpKTsKICAgICAgICAgICAgY250T2ZDbnRbMF0gPSBuOwoKICAgICAgICAgICAgRk9SKHIsIGwsIG4pIHsKICAgICAgICAgICAgICAgIGNudE9mQ250W2NudFthW3JdXV0tLTsKICAgICAgICAgICAgICAgIGNudFthW3JdXSsrOwogICAgICAgICAgICAgICAgY250T2ZDbnRbY250W2Fbcl1dXSsrOwoKICAgICAgICAgICAgICAgIGJvb2wgb2sgPSB0cnVlOwogICAgICAgICAgICAgICAgRk9SKGksIDEsIG0pIGlmIChjbnRPZkNudFtpXSA9PSAwKSBvayA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKG9rKSByZXMrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHJpbnRmKCIlZFxuIiwgcmVzKTsKICAgIH0KfQoKbmFtZXNwYWNlIHN1YnRhc2syIHsKICAgIGJvb2wgY2hlY2sodm9pZCkgewogICAgICAgIEZPUihpLCAxLCBuKSBpZiAoYVtpXSA+IG0pIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBpbnQgY250WzEwXSwgaGF2ZVsxMF07CgogICAgdm9pZCBwcm9jZXNzKHZvaWQpIHsKICAgICAgICBpbnQgcmVzID0gMDsKICAgICAgICBGT1IoaSwgMSwgbikgaWYgKGkgKyBtICogKG0gKyAxKSAvIDIgLSAxIDw9IG4pIHsKICAgICAgICAgICAgaW50IGogPSBpICsgbSAqIChtICsgMSkgLyAyIC0gMTsKICAgICAgICAgICAgbWVtc2V0KGNudCwgMCwgc2l6ZW9mIGNudCk7CiAgICAgICAgICAgIG1lbXNldChoYXZlLCAwLCBzaXplb2YgaGF2ZSk7CiAgICAgICAgICAgIEZPUihrLCBpLCBqKSBjbnRbYVtrXV0rKzsKICAgICAgICAgICAgRk9SKGssIDEsIG0pIGhhdmVbY250W2tdXSsrOwoKICAgICAgICAgICAgYm9vbCBvayA9IHRydWU7CiAgICAgICAgICAgIEZPUihrLCAxLCBtKSBpZiAoaGF2ZVtrXSA9PSAwKSBvayA9IGZhbHNlOwogICAgICAgICAgICBpZiAob2spIHJlcysrOwogICAgICAgIH0KICAgICAgICBwcmludGYoIiVkXG4iLCByZXMpOwogICAgfQp9CgpuYW1lc3BhY2Ugc3VidGFzazQgewogICAgYm9vbCBjaGVjayh2b2lkKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgdmVjdG9yPGludD4gcG9zW01BWF07CiAgICB2ZWN0b3I8VXBkYXRlPiB1cGRhdGVzWzVdW01BWF07CgogICAgdm9pZCBhZGRSZWN0YW5nbGUoaW50IGlkLCBpbnQgbWluWCwgaW50IG1heFgsIGludCBtaW5ZLCBpbnQgbWF4WSkgewogICAgICAgIHVwZGF0ZXNbaWRdW21pblhdLnB1c2hfYmFjayhVcGRhdGUobWluWSwgbWF4WSwgKzEpKTsKICAgICAgICB1cGRhdGVzW2lkXVttYXhYICsgMV0ucHVzaF9iYWNrKFVwZGF0ZShtaW5ZLCBtYXhZLCAtMSkpOwogICAgfQoKICAgIHZvaWQgcHJlcGFyZSh2b2lkKSB7CiAgICAgICAgRk9SKGksIDEsIG4pIHBvc1thW2ldXS5wdXNoX2JhY2soaSk7CiAgICAgICAgRk9SKGksIDEsIG4pIHsKICAgICAgICAgICAgdmVjdG9yPGludD4gJnYgPSBwb3NbaV07CiAgICAgICAgICAgIHYuaW5zZXJ0KHYuYmVnaW4oKSwgMCk7CiAgICAgICAgICAgIHYucHVzaF9iYWNrKG4gKyAxKTsKCiAgICAgICAgICAgIEZPUihqLCAxLCB2LnNpemUoKSAtIDIpIFJFUChrLCBtKSBpZiAoaiArIGsgPD0gKGludCl2LnNpemUoKSAtIDIpCiAgICAgICAgICAgICAgICBhZGRSZWN0YW5nbGUoayArIDEsIHZbaiAtIDFdICsgMSwgdltqXSwgdltqICsga10sIHZbaiArIGsgKyAxXSAtIDEpOwogICAgICAgIH0KICAgIH0KCiAgICBsb25nIGxvbmcgY291bnROdW1iZXIoaW50IG1hc2spIHsKICAgICAgICBTZWdtZW50VHJlZSBteWl0KG4pOwogICAgICAgIGxvbmcgbG9uZyByZXMgPSAwOwogICAgICAgIEZPUihpLCAxLCBuKSB7CiAgICAgICAgICAgIEZPUihqLCAxLCBtKSBpZiAoQklUKG1hc2ssIGogLSAxKSkgewogICAgICAgICAgICAgICAgZm9yIChjb25zdCBVcGRhdGUgJnUgOiB1cGRhdGVzW2pdW2ldKSBteWl0LnVwZGF0ZSh1LmZyLCB1LnRvLCB1LmRlbHRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXMgKz0gbXlpdC5nZXROdW1aZXJvKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzIC0gMUxMICogbiAqIChuIC0gMSkgLyAyOwogICAgfQoKICAgIHZvaWQgcHJvY2Vzcyh2b2lkKSB7CiAgICAgICAgcHJlcGFyZSgpOwoKICAgICAgICBsb25nIGxvbmcgcmVzID0gMUxMICogbiAqIChuICsgMSkgLyAyOwogICAgICAgIEZPUihtYXNrLCAxLCBNQVNLKG0pIC0gMSkgewogICAgICAgICAgICBsb25nIGxvbmcgdG1wID0gY291bnROdW1iZXIobWFzayk7CiAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fcG9wY291bnQobWFzaykgJSAyID09IDApIHJlcyArPSB0bXA7CiAgICAgICAgICAgIGVsc2UgcmVzIC09IHRtcDsKICAgICAgICB9CiAgICAgICAgY291dCA8PCByZXMgPDwgIlxuIjsKICAgIH0KfQoKaW50IG1haW4odm9pZCkgewogICAgaW5pdCgpOwogICAgaWYgKHN1YnRhc2sxOjpjaGVjaygpKSByZXR1cm4gc3VidGFzazE6OnByb2Nlc3MoKSwgMDsKICAgIGlmIChzdWJ0YXNrMjo6Y2hlY2soKSkgcmV0dXJuIHN1YnRhc2syOjpwcm9jZXNzKCksIDA7CiAgICBpZiAoc3VidGFzazQ6OmNoZWNrKCkpIHJldHVybiBzdWJ0YXNrNDo6cHJvY2VzcygpLCAwOwogICAgcmV0dXJuIDA7Cn0K