1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class range
{
private:
    const int start, stop, step;
 
public:
    typedef int64_t difference_type;
    class iterator
    {
    private:
        size_t idx;
        range& parent;
 
    public:
        iterator(range& x, int64_t a = 0) : idx(a), parent(x) {}
        int64_t operator * () { return parent.start + parent.step * idx; }
        iterator& operator ++ () { idx++; return *this; }
        iterator& operator -- () { idx--; return *this; }
        iterator operator ++ (int) { iterator tmp(*this); idx++; return tmp; }
        iterator operator -- (int) { iterator tmp(*this); idx--; return tmp; }
        iterator operator + (int64_t a) { return iterator(parent, idx + a); }
        iterator operator - (int64_t a) { return iterator(parent, idx - a); }
        bool operator != (iterator a) { return (&parent != &a.parent || idx != a.idx); }
    };
 
    range(int64_t stop) : start(0), stop(stop), step(1) {};
    range(int64_t start, int64_t stop, int64_t step = 1) : start(start), stop(stop), step(step) {};
    iterator begin() { return iterator(*this); }
    iterator end() { return iterator(*this, (stop - start + step - 1) / step); }
    int64_t operator [] (int64_t a)
    {
        if (a >= (stop - start + step - 1) / step)
            throw std::out_of_range("");
        return start + a * step;
    }
};
cs


근데 range(0, INT64_MAX, 3)같은거 돌리면 잘 안돌아간다

뭐 당연히 오버플로우 때문이겠지? 근데 bigint같은거 쓰는건 좀 오바떠는것같아


사짜 이터레이터라 범위 잡아서 벡터에 복사해넣는것도 안돌아가네ㅋㅋㅋㅋ