#include <iostream>
#include <algorithm>

template <class T>
struct S
{   
    T I;
    S()
    {   
        static int i;
        int sign = i % 2 ? 1 : -1;
        I = ++i * sign;
    }

    bool operator < (const S& rhs) const
    {   
        return I < rhs.I;
    }
};

namespace std {
    template <class T>
    inline void swap(S<T>& lhs, S<T>& rhs)
    {   
        std::cout << "called" << std::endl;
        int tmp = lhs.I;
        lhs.I = rhs.I;
        rhs.I = tmp;
    }
}

int main()
{   
    S<int> s[10];
    for (unsigned i = 0; i < sizeof(s) / sizeof(s[0]); ++i)
    {   
        std::cout << s[i].I << ' ';
    }
    std::cout << std::endl;

    std::sort(s, s + sizeof(s) / sizeof(s[0]));
    for (unsigned i = 0; i < sizeof(s) / sizeof(s[0]); ++i)
    {   
        std::cout << s[i].I << ' ';
    }
    std::cout << std::endl;
}

