#include <iostream>
#include <algorithm>
#include <set>
class Solution
{
public:
template<size_t N>
static size_t distinct (int (&a)[N])
{
std::cerr << "DEBUG: size of array: " << N << " elements" << std::endl;
return std::set<int>(a, a+N).size();
}
template<size_t N>
static size_t distinct_optim(int (&a)[N])
{
std::sort(a, a+N);
int* newend = std::unique(a, a+N);
return newend - a;
}
};
int main()
{
int data[] = { 19415, -2611, 12092, -3942, -2535, 12105, 21079, 4660, 3,
27131, 13647, 24428, 15159, 9029, 24827, -979, 17194, 25102, -3631,
20914, -3223, 25801, 6652, 26208, -77, 15606, 8764, 1896, 7430, 24323,
-152, 23805, -4259, 11243, 13367, 23559, 19293, 18581, 1639, 15671,
7929, 18386, 5168, 13816, 465, 15801, 16750, -3340, -202, 10412, 11068,
13458, 24304, 14814, 6530, 1178, -974, 12882, 757, 583, 4897, 24541,
12490, -119, 2240, -4833, 569, 24700, 24522, 8708, 9760, 26837, 26060,
20914, -3223, 25801, 6652, 26208, -77, 15606, 8764, 1896, 7430, 24323,
3377, 6972, 25689, 2334, 1567, 21670, 23233, 14711, 4650, -4703, 25057,
16057, 19488, 14575, 18936, 13346, 2779, 5644, 17165, 4526, 4390,
9616, 2413, 14459, -1070, -4079, 22126, 9063, 4362, 8182, 24439, 23625,
7929, 18386, 5168, 13816, 465, 15801, 16750, -3340, -202, 10412, 11068,
4184, 25930, 24767, 2785, 17361, 18033, 12366, 20548, -3831, -4101,
16841, -193, 23217, 6351, 19077, 23565, 10482, 4100, 27488, 15956,
-2577, 7161, 20943, 25708, -2877, 7900, -4564, -3647, 12008, 1648,
10533 };
// using std::set (max O(n) additional storage)
std::cout << Solution::distinct(data) << std::endl;
// using std::unique (inplace mutation; no additional storage)
std::cout << Solution::distinct_optim(data) << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8c2V0PgogCmNsYXNzIFNvbHV0aW9uIAp7IAogICBwdWJsaWM6IAogICAgIHRlbXBsYXRlPHNpemVfdCBOPgogICAgICAgICBzdGF0aWMgc2l6ZV90IGRpc3RpbmN0IChpbnQgKCZhKVtOXSkKICAgICB7CiAgICAgICAgIHN0ZDo6Y2VyciA8PCAiREVCVUc6IHNpemUgb2YgYXJyYXk6ICIgPDwgTiA8PCAiIGVsZW1lbnRzIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgIHJldHVybiBzdGQ6OnNldDxpbnQ+KGEsIGErTikuc2l6ZSgpOwogICAgIH0KCiAgICAgdGVtcGxhdGU8c2l6ZV90IE4+CiAgICAgICAgIHN0YXRpYyBzaXplX3QgZGlzdGluY3Rfb3B0aW0oaW50ICgmYSlbTl0pCiAgICAgewogICAgICAgICBzdGQ6OnNvcnQoYSwgYStOKTsKICAgICAgICAgaW50KiBuZXdlbmQgPSBzdGQ6OnVuaXF1ZShhLCBhK04pOwogICAgICAgICByZXR1cm4gbmV3ZW5kIC0gYTsKICAgICB9Cn07CiAKaW50IG1haW4oKQp7CiAgICBpbnQgZGF0YVtdID0geyAxOTQxNSwgLTI2MTEsIDEyMDkyLCAtMzk0MiwgLTI1MzUsIDEyMTA1LCAyMTA3OSwgNDY2MCwgMywKICAgICAgICAyNzEzMSwgMTM2NDcsIDI0NDI4LCAxNTE1OSwgOTAyOSwgMjQ4MjcsIC05NzksIDE3MTk0LCAyNTEwMiwgLTM2MzEsCiAgICAgICAgMjA5MTQsIC0zMjIzLCAyNTgwMSwgNjY1MiwgMjYyMDgsIC03NywgMTU2MDYsIDg3NjQsIDE4OTYsIDc0MzAsIDI0MzIzLAogICAgICAgIC0xNTIsIDIzODA1LCAtNDI1OSwgMTEyNDMsIDEzMzY3LCAyMzU1OSwgMTkyOTMsIDE4NTgxLCAxNjM5LCAxNTY3MSwKICAgICAgICA3OTI5LCAxODM4NiwgNTE2OCwgMTM4MTYsIDQ2NSwgMTU4MDEsIDE2NzUwLCAtMzM0MCwgLTIwMiwgMTA0MTIsIDExMDY4LAogICAgICAgIDEzNDU4LCAyNDMwNCwgMTQ4MTQsIDY1MzAsIDExNzgsIC05NzQsIDEyODgyLCA3NTcsIDU4MywgNDg5NywgMjQ1NDEsCiAgICAgICAgMTI0OTAsIC0xMTksIDIyNDAsIC00ODMzLCA1NjksIDI0NzAwLCAyNDUyMiwgODcwOCwgOTc2MCwgMjY4MzcsIDI2MDYwLAogICAgICAgIDIwOTE0LCAtMzIyMywgMjU4MDEsIDY2NTIsIDI2MjA4LCAtNzcsIDE1NjA2LCA4NzY0LCAxODk2LCA3NDMwLCAyNDMyMywKICAgICAgICAzMzc3LCA2OTcyLCAyNTY4OSwgMjMzNCwgMTU2NywgMjE2NzAsIDIzMjMzLCAxNDcxMSwgNDY1MCwgLTQ3MDMsIDI1MDU3LAogICAgICAgIDE2MDU3LCAxOTQ4OCwgMTQ1NzUsIDE4OTM2LCAxMzM0NiwgMjc3OSwgNTY0NCwgMTcxNjUsIDQ1MjYsIDQzOTAsCiAgICAgICAgOTYxNiwgMjQxMywgMTQ0NTksIC0xMDcwLCAtNDA3OSwgMjIxMjYsIDkwNjMsIDQzNjIsIDgxODIsIDI0NDM5LCAyMzYyNSwKICAgICAgICA3OTI5LCAxODM4NiwgNTE2OCwgMTM4MTYsIDQ2NSwgMTU4MDEsIDE2NzUwLCAtMzM0MCwgLTIwMiwgMTA0MTIsIDExMDY4LAogICAgICAgIDQxODQsIDI1OTMwLCAyNDc2NywgMjc4NSwgMTczNjEsIDE4MDMzLCAxMjM2NiwgMjA1NDgsIC0zODMxLCAtNDEwMSwKICAgICAgICAxNjg0MSwgLTE5MywgMjMyMTcsIDYzNTEsIDE5MDc3LCAyMzU2NSwgMTA0ODIsIDQxMDAsIDI3NDg4LCAxNTk1NiwKICAgICAgICAtMjU3NywgNzE2MSwgMjA5NDMsIDI1NzA4LCAtMjg3NywgNzkwMCwgLTQ1NjQsIC0zNjQ3LCAxMjAwOCwgMTY0OCwKICAgICAgICAxMDUzMyB9OwogCiAgICAvLyB1c2luZyBzdGQ6OnNldCAobWF4IE8obikgYWRkaXRpb25hbCBzdG9yYWdlKQogICAgc3RkOjpjb3V0IDw8IFNvbHV0aW9uOjpkaXN0aW5jdChkYXRhKSA8PCBzdGQ6OmVuZGw7CiAKICAgIC8vIHVzaW5nIHN0ZDo6dW5pcXVlIChpbnBsYWNlIG11dGF0aW9uOyBubyBhZGRpdGlvbmFsIHN0b3JhZ2UpCiAgICBzdGQ6OmNvdXQgPDwgU29sdXRpb246OmRpc3RpbmN0X29wdGltKGRhdGEpIDw8IHN0ZDo6ZW5kbDsKfQo=