#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <random>
#include <set>
#include <sstream>
#include <string>
#include <utility>
using namespace std;
#define DBG(x) { cout << left << setw(40) << #x << (x) << endl; }
class LosowanieBezPowtorzen
{
public:
LosowanieBezPowtorzen(std::set<int> wartosci) : wartosci_(move(wartosci)) {}
LosowanieBezPowtorzen(initializer_list<int> l) : wartosci_(l) {}
template<typename Gen>
int losuj(Gen&& gen){
if(wartosci_.size() == 0)
throw out_of_range("Skonczyly sie wartosci do losowania");
uniform_int_distribution<int> dis(0,wartosci_.size()-1);
auto it = begin(wartosci_);
advance(it,dis(gen));
int ret = *it;
wartosci_.erase(it);
return ret;
}
private:
std::set<int> wartosci_;
};
int main()
{
mt19937_64 gen(random_device{}());
LosowanieBezPowtorzen l{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};
for(int i = 0; i < 20; i++){
DBG(l.losuj(gen));
}
}
I2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjdGltZT4KCiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxkZXF1ZT4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHJhbmRvbT4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx1dGlsaXR5PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgREJHKHgpIHsgY291dCA8PCBsZWZ0IDw8IHNldHcoNDApIDw8ICN4IDw8ICh4KSA8PCBlbmRsOyB9CgpjbGFzcyBMb3Nvd2FuaWVCZXpQb3d0b3J6ZW4KewpwdWJsaWM6CglMb3Nvd2FuaWVCZXpQb3d0b3J6ZW4oc3RkOjpzZXQ8aW50PiB3YXJ0b3NjaSkgOiB3YXJ0b3NjaV8obW92ZSh3YXJ0b3NjaSkpIHt9CgoJTG9zb3dhbmllQmV6UG93dG9yemVuKGluaXRpYWxpemVyX2xpc3Q8aW50PiBsKSA6IHdhcnRvc2NpXyhsKSB7fQoKCXRlbXBsYXRlPHR5cGVuYW1lIEdlbj4KCWludCBsb3N1aihHZW4mJiBnZW4pewoJCWlmKHdhcnRvc2NpXy5zaXplKCkgPT0gMCkKCQkJdGhyb3cgb3V0X29mX3JhbmdlKCJTa29uY3p5bHkgc2llIHdhcnRvc2NpIGRvIGxvc293YW5pYSIpOwoKCQl1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PiBkaXMoMCx3YXJ0b3NjaV8uc2l6ZSgpLTEpOwoJCWF1dG8gaXQgPSBiZWdpbih3YXJ0b3NjaV8pOwoJCWFkdmFuY2UoaXQsZGlzKGdlbikpOwoJCWludCByZXQgPSAqaXQ7CgkJd2FydG9zY2lfLmVyYXNlKGl0KTsKCQlyZXR1cm4gcmV0OwoJfQoKcHJpdmF0ZToKCglzdGQ6OnNldDxpbnQ+IHdhcnRvc2NpXzsKfTsKCmludCBtYWluKCkKewoJbXQxOTkzN182NCBnZW4ocmFuZG9tX2RldmljZXt9KCkpOwoKCUxvc293YW5pZUJlelBvd3RvcnplbiBsezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1fTsKCglmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKyl7CgkJREJHKGwubG9zdWooZ2VuKSk7Cgl9Cn0K