#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using CandiesJar = vector<int>;
static inline void ExtendUnqueRange(vector<bool>& usedFlavors,
CandiesJar::const_iterator& rangeEnd,
const CandiesJar::const_iterator& jarEnd)
{
while (rangeEnd != jarEnd && !usedFlavors[*rangeEnd])
{
usedFlavors[*rangeEnd] = true;
++rangeEnd;
}
}
static inline void CollapseUniqueRangeToValue(vector<bool>& usedFlavors,
CandiesJar::const_iterator& rangeStart,
CandiesJar::value_type removeValue)
{
while (*rangeStart != removeValue)
{
usedFlavors[*rangeStart] = false;
++rangeStart;
}
}
static inline auto CountPossibleSubranges(const CandiesJar::const_iterator& start,
const CandiesJar::const_iterator& stop) -> uint64_t
{
auto len = static_cast<uint64_t>(distance(start, stop));
return len * (len + 1) / 2;
}
auto CountSeriesWithUniqueItems(const CandiesJar& candies, int m) -> uint64_t
{
auto result = uint64_t(0);
auto usedFlavors = vector<bool>(m, false);
auto start = begin(candies);
auto stop = start;
auto oldStop = stop;
ExtendUnqueRange(usedFlavors, stop, end(candies));
while (stop != end(candies))
{
result += CountPossibleSubranges(start, stop) - CountPossibleSubranges(start, oldStop);
CollapseUniqueRangeToValue(usedFlavors, start, *stop);
oldStop = stop;
// here start and stop are pointing to same flavor
++start; // remove flavor form beginning
++stop; // add flavor to end
ExtendUnqueRange(usedFlavors, stop, end(candies));
}
result += CountPossibleSubranges(start, stop) - CountPossibleSubranges(start, oldStop);
return result;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
unsigned long long expected;
auto pass = 0;
auto fail = 0;
while (cin >> n >> m >> expected)
{
CandiesJar candies;
candies.reserve(n);
for (int i=0; i<n; ++i)
{
int c;
cin >> c;
candies.push_back(c-1);
}
auto result = CountSeriesWithUniqueItems(candies, m);
if (expected != result)
{
++fail;
for (auto x : candies)
{
cout << x << ", ";
}
cout << "\nExpected: " << expected << "\nActual : " << result << '\n' << endl;
} else {
++pass;
}
}
cout << "Pass: " << pass << " fail: " << fail <<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnVzaW5nIENhbmRpZXNKYXIgPSB2ZWN0b3I8aW50PjsKCnN0YXRpYyBpbmxpbmUgdm9pZCBFeHRlbmRVbnF1ZVJhbmdlKHZlY3Rvcjxib29sPiYgdXNlZEZsYXZvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbmRpZXNKYXI6OmNvbnN0X2l0ZXJhdG9yJiByYW5nZUVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FuZGllc0phcjo6Y29uc3RfaXRlcmF0b3ImIGphckVuZCkKewogICAgd2hpbGUgKHJhbmdlRW5kICE9IGphckVuZCAmJiAhdXNlZEZsYXZvcnNbKnJhbmdlRW5kXSkKICAgIHsKICAgICAgICB1c2VkRmxhdm9yc1sqcmFuZ2VFbmRdID0gdHJ1ZTsKICAgICAgICArK3JhbmdlRW5kOwogICAgfQp9CgpzdGF0aWMgaW5saW5lIHZvaWQgQ29sbGFwc2VVbmlxdWVSYW5nZVRvVmFsdWUodmVjdG9yPGJvb2w+JiB1c2VkRmxhdm9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbmRpZXNKYXI6OmNvbnN0X2l0ZXJhdG9yJiByYW5nZVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuZGllc0phcjo6dmFsdWVfdHlwZSByZW1vdmVWYWx1ZSkKewogICAgd2hpbGUgKCpyYW5nZVN0YXJ0ICE9IHJlbW92ZVZhbHVlKQogICAgewogICAgICAgIHVzZWRGbGF2b3JzWypyYW5nZVN0YXJ0XSA9IGZhbHNlOwogICAgICAgICsrcmFuZ2VTdGFydDsKICAgIH0KfQoKc3RhdGljIGlubGluZSBhdXRvIENvdW50UG9zc2libGVTdWJyYW5nZXMoY29uc3QgQ2FuZGllc0phcjo6Y29uc3RfaXRlcmF0b3ImIHN0YXJ0LAogICAgICAgICBjb25zdCBDYW5kaWVzSmFyOjpjb25zdF9pdGVyYXRvciYgc3RvcCkgLT4gdWludDY0X3QKewogICAgYXV0byBsZW4gPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZGlzdGFuY2Uoc3RhcnQsIHN0b3ApKTsKICAgIHJldHVybiBsZW4gKiAobGVuICsgMSkgLyAyOwp9CgphdXRvIENvdW50U2VyaWVzV2l0aFVuaXF1ZUl0ZW1zKGNvbnN0IENhbmRpZXNKYXImIGNhbmRpZXMsIGludCBtKSAtPiB1aW50NjRfdAp7CiAgICBhdXRvIHJlc3VsdCA9IHVpbnQ2NF90KDApOwogICAgYXV0byB1c2VkRmxhdm9ycyA9IHZlY3Rvcjxib29sPihtLCBmYWxzZSk7CiAgICAKICAgIGF1dG8gc3RhcnQgPSBiZWdpbihjYW5kaWVzKTsKICAgIGF1dG8gc3RvcCA9IHN0YXJ0OwogICAgCiAgICBhdXRvIG9sZFN0b3AgPSBzdG9wOwogICAgRXh0ZW5kVW5xdWVSYW5nZSh1c2VkRmxhdm9ycywgc3RvcCwgZW5kKGNhbmRpZXMpKTsKICAgIAogICAgd2hpbGUgKHN0b3AgIT0gZW5kKGNhbmRpZXMpKQogICAgewogICAgICAgIHJlc3VsdCArPSBDb3VudFBvc3NpYmxlU3VicmFuZ2VzKHN0YXJ0LCBzdG9wKSAtIENvdW50UG9zc2libGVTdWJyYW5nZXMoc3RhcnQsIG9sZFN0b3ApOwogICAgICAgIAogICAgICAgIENvbGxhcHNlVW5pcXVlUmFuZ2VUb1ZhbHVlKHVzZWRGbGF2b3JzLCBzdGFydCwgKnN0b3ApOwogICAgICAgIG9sZFN0b3AgPSBzdG9wOwogICAgICAgIAogICAgICAgIC8vIGhlcmUgc3RhcnQgYW5kIHN0b3AgYXJlIHBvaW50aW5nIHRvIHNhbWUgZmxhdm9yCiAgICAgICAgKytzdGFydDsgLy8gcmVtb3ZlIGZsYXZvciBmb3JtIGJlZ2lubmluZwogICAgICAgICsrc3RvcDsgLy8gYWRkIGZsYXZvciB0byBlbmQKICAgICAgICAKICAgICAgICBFeHRlbmRVbnF1ZVJhbmdlKHVzZWRGbGF2b3JzLCBzdG9wLCBlbmQoY2FuZGllcykpOwogICAgfSAgICAKICAgIHJlc3VsdCArPSBDb3VudFBvc3NpYmxlU3VicmFuZ2VzKHN0YXJ0LCBzdG9wKSAtIENvdW50UG9zc2libGVTdWJyYW5nZXMoc3RhcnQsIG9sZFN0b3ApOwoKICAgIHJldHVybiByZXN1bHQ7Cn0KCmludCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBpbnQgbiwgbTsKICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBleHBlY3RlZDsKICAgIGF1dG8gcGFzcyA9IDA7CiAgICBhdXRvIGZhaWwgPSAwOwogICAgd2hpbGUgKGNpbiA+PiBuID4+IG0gPj4gZXhwZWN0ZWQpCiAgICB7CiAgICAgICAgQ2FuZGllc0phciBjYW5kaWVzOwogICAgICAgIGNhbmRpZXMucmVzZXJ2ZShuKTsKICAgICAgICBmb3IgKGludCBpPTA7IGk8bjsgKytpKQogICAgICAgIHsKICAgICAgICAgICAgaW50IGM7CiAgICAgICAgICAgIGNpbiA+PiBjOwogICAgICAgICAgICBjYW5kaWVzLnB1c2hfYmFjayhjLTEpOwogICAgICAgIH0KICAgICAgICBhdXRvIHJlc3VsdCA9IENvdW50U2VyaWVzV2l0aFVuaXF1ZUl0ZW1zKGNhbmRpZXMsIG0pOwogICAgICAgIGlmIChleHBlY3RlZCAhPSByZXN1bHQpCiAgICAgICAgewogICAgICAgICAgICArK2ZhaWw7CiAgICAgICAgICAgIGZvciAoYXV0byB4IDogY2FuZGllcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY291dCA8PCB4IDw8ICIsICI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY291dCA8PCAiXG5FeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiXG5BY3R1YWwgIDogIiA8PCByZXN1bHQgPDwgJ1xuJyA8PCBlbmRsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICsrcGFzczsKICAgICAgICB9CiAgICB9CiAgICBjb3V0IDw8ICJQYXNzOiAiIDw8IHBhc3MgPDwgIiBmYWlsOiAiIDw8IGZhaWwgPDxlbmRsOwogICAgcmV0dXJuIDA7Cn0K