11#pragma once
22
3- template <class T = unsigned int , class U = unsigned long long >
3+ template <class T = int , class U = unsigned long long >
44class IntegerSet {
55 private:
66 const static T B = 6 , W = 64 , MASK = W - 1 ;
@@ -24,11 +24,12 @@ class IntegerSet {
2424 while (n > 0 );
2525 start = vector<T>(1 , 0 );
2626 start.reserve (len.size () + 1 );
27- for (const auto v : len) start.push_back (start.back () + v);
27+ for (auto v : len) start.push_back (start.back () + v);
2828 data = vector<U>(start.back ());
2929 }
3030 IntegerSet (string s = " " ) {
31- T n = size = s.size ();
31+ size = s.size ();
32+ T n = size;
3233 vector<T> len;
3334 do len.push_back ((n >>= B) + 1 );
3435 while (n > 0 );
@@ -58,11 +59,11 @@ class IntegerSet {
5859 }
5960 }
6061 bool contains (T x) const { return (data[x >> B] >> (x & MASK)) & 1 ; }
61- optional<T> min (T x) const {
62+ T min (T x) const {
6263 T d = 0 , i = x;
6364 while (true ) {
64- if (d + 1 >= start.size ()) return nullopt ;
65- if ((i >> B) >= start[d + 1 ] - start[d]) return nullopt ;
65+ if (d + 1 >= start.size ()) return - 1 ;
66+ if ((i >> B) >= start[d + 1 ] - start[d]) return - 1 ;
6667 U m = data[start[d] + (i >> B)] & ((~U (0 )) << (i & MASK));
6768 if (m == 0 ) {
6869 d++;
@@ -77,11 +78,11 @@ class IntegerSet {
7778 }
7879 return i;
7980 }
80- optional<T> max (T x) const {
81+ T max (T x) const {
8182 T d = 0 , i = x;
8283 while (true ) {
83- if (i >= size ) return nullopt ;
84- if (d >= data.size ()) return nullopt ;
84+ if (i < 0 ) return - 1 ;
85+ if (d >= data.size ()) return - 1 ;
8586 U m = data[start[d] + (i >> B)] & ~((~U (1 )) << (i & MASK));
8687 if (m == 0 ) {
8788 d++;
0 commit comments