#include <list>
#include <array>
#include <set>
using namespace std;
#define nullptr NULL
template <typename T_>
class square_list
{
public:
typedef T_ value_type;
typedef std::size_t size_type;
typedef T_ & reference;
typedef T_ const & const_reference;
typedef T_ * pointer;
typedef T_ const * const_pointer;
typedef T_ * iterator;
typedef T_ const * const_iterator;
typedef std::ptrdiff_t difference_type;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
//list<pair<iterator,unsigned> topLevel;
list<value_type> data;
//list<value_type,size_type> data;
//int size;
square_list() {}
//square_list():data(list<value_type>()),size(0) {}
~square_list(){}
bool empty(){
if(data.size() == 0)
return 1;
else
return 0;
}
unsigned size()
{
return data.size();
}
typename list<value_type>::iterator begin()
{
return data.begin();
}
typename list<value_type>::iterator end()
{
return data.end();
}
void erase(typename std::list<value_type>::iterator it)
{
data.erase(it);
}
void insert(value_type val)
{
data.push_back(val);
}
};
int main()
{
std::array<int,10> data = { 9, 10, 7, 8, 5, 6, 3, 4, 1, 2 };
std::set<int> sortedData( data.begin(), data.end() );
square_list<int> sqi;
for( auto datum=data.begin();datum!= data.end(); ++datum )
sqi.insert( *datum );
// remove the data from the list in the scrambled order of the first vector.
while( !sqi.empty() && !sortedData.empty() ) {
size_t idx = rand() % sqi.size();
auto sdLoc = sortedData.begin();
advance(sdLoc,idx);
auto sqLoc = sqi.begin();
while( idx-- > 0 )
++sqLoc;
sortedData.erase(sdLoc);
//sqi.dump(std::cout);
sqi.erase(sqLoc);
}
}
I2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxhcnJheT4KI2luY2x1ZGUgPHNldD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbnVsbHB0ciBOVUxMCnRlbXBsYXRlIDx0eXBlbmFtZSBUXz4KY2xhc3Mgc3F1YXJlX2xpc3QKewpwdWJsaWM6Cgl0eXBlZGVmIFRfICAgICAgICAgICAgICB2YWx1ZV90eXBlOwoJdHlwZWRlZiBzdGQ6OnNpemVfdCAgICAgc2l6ZV90eXBlOwoJdHlwZWRlZiBUXyAmICAgICAgICAgICAgcmVmZXJlbmNlOwoJdHlwZWRlZiBUXyBjb25zdCAmICAgICAgY29uc3RfcmVmZXJlbmNlOwoJdHlwZWRlZiBUXyAqICAgICAgICAgICAgcG9pbnRlcjsKCXR5cGVkZWYgVF8gY29uc3QgKiAgICAgIGNvbnN0X3BvaW50ZXI7Cgl0eXBlZGVmIFRfICogICAgICAgICAgICBpdGVyYXRvcjsKCXR5cGVkZWYgVF8gY29uc3QgKiAgICAgIGNvbnN0X2l0ZXJhdG9yOwoJdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgZGlmZmVyZW5jZV90eXBlOwoKCXR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yOwoJdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CgoKCgkvL2xpc3Q8cGFpcjxpdGVyYXRvcix1bnNpZ25lZD4gdG9wTGV2ZWw7CglsaXN0PHZhbHVlX3R5cGU+IGRhdGE7CgkvL2xpc3Q8dmFsdWVfdHlwZSxzaXplX3R5cGU+IGRhdGE7CgkvL2ludCBzaXplOwoKCglzcXVhcmVfbGlzdCgpIHt9CgkvL3NxdWFyZV9saXN0KCk6ZGF0YShsaXN0PHZhbHVlX3R5cGU+KCkpLHNpemUoMCkge30KCgl+c3F1YXJlX2xpc3QoKXt9CgoJYm9vbCBlbXB0eSgpewoJCWlmKGRhdGEuc2l6ZSgpID09IDApCgkJCXJldHVybiAxOwoJCWVsc2UKCQkJcmV0dXJuIDA7Cgl9CgoJdW5zaWduZWQgc2l6ZSgpCgl7CgkJcmV0dXJuICBkYXRhLnNpemUoKTsKCX0KCXR5cGVuYW1lIGxpc3Q8dmFsdWVfdHlwZT46Oml0ZXJhdG9yICBiZWdpbigpCgl7CgkJcmV0dXJuIGRhdGEuYmVnaW4oKTsKCX0KCXR5cGVuYW1lIGxpc3Q8dmFsdWVfdHlwZT46Oml0ZXJhdG9yICBlbmQoKQoJewoJCXJldHVybiBkYXRhLmVuZCgpOwoJfQoKCgoJdm9pZCBlcmFzZSh0eXBlbmFtZSBzdGQ6Omxpc3Q8dmFsdWVfdHlwZT46Oml0ZXJhdG9yIGl0KQoJewoJCWRhdGEuZXJhc2UoaXQpOwoJfQoKCXZvaWQgaW5zZXJ0KHZhbHVlX3R5cGUgdmFsKQoJewoJCWRhdGEucHVzaF9iYWNrKHZhbCk7Cgl9Cgp9OwoKaW50IG1haW4oKQp7CglzdGQ6OmFycmF5PGludCwxMD4gZGF0YSA9IHsgOSwgMTAsIDcsIDgsIDUsIDYsIDMsIDQsIDEsIDIgfTsKCXN0ZDo6c2V0PGludD4gc29ydGVkRGF0YSggZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpICk7CgoJc3F1YXJlX2xpc3Q8aW50PiBzcWk7Cglmb3IoIGF1dG8gZGF0dW09ZGF0YS5iZWdpbigpO2RhdHVtIT0gZGF0YS5lbmQoKTsgKytkYXR1bSApCgkJc3FpLmluc2VydCggKmRhdHVtICk7CgoJLy8gcmVtb3ZlIHRoZSBkYXRhIGZyb20gdGhlIGxpc3QgaW4gdGhlIHNjcmFtYmxlZCBvcmRlciBvZiB0aGUgZmlyc3QgdmVjdG9yLgoJd2hpbGUoICFzcWkuZW1wdHkoKSAmJiAhc29ydGVkRGF0YS5lbXB0eSgpICkgewoJCXNpemVfdCBpZHggPSByYW5kKCkgJSBzcWkuc2l6ZSgpOwoJCWF1dG8gc2RMb2MgPSBzb3J0ZWREYXRhLmJlZ2luKCk7CgkJYWR2YW5jZShzZExvYyxpZHgpOwoJCWF1dG8gc3FMb2MgPSBzcWkuYmVnaW4oKTsKCQl3aGlsZSggaWR4LS0gPiAwICkKCQkJKytzcUxvYzsKCQlzb3J0ZWREYXRhLmVyYXNlKHNkTG9jKTsKCQkvL3NxaS5kdW1wKHN0ZDo6Y291dCk7CgkJc3FpLmVyYXNlKHNxTG9jKTsKCgl9Cn0=