#include <string>
#include <iostream>
#include <cstring>
using namespace std;
class permu {
private:
int sort[99999];
int size;
public:
permu() {
memset(sort, 0, sizeof(sort));
size = 0;
};
permu(int n) {
memset(sort, 0, sizeof(sort));
for (int i = 0; i < n; i++) {
sort[i] = i;
}
size = n;
}
permu(const permu& other) {
memset(sort, 0, sizeof(sort));
for (int i = 0; i < other.size; i++) {
sort[i] = other.sort[i];
}
size = other.size;
}
void turn (int n, int m) {
int temp = sort[n];
sort[n] = sort[m];
sort[m] = temp;
}
void preper() {
if (size == 2) {
turn(0,1);
return;
}
bool isfin = 1;
int i, j;
for (i = 0; i < size - 1; i++) { // Judge if finished
if (sort[i] > sort[i + 1]) {
isfin = 0;
break;
}
}
if (!isfin) {
for (i = size - 1; i >= 0; i--) {
if (sort[i] < sort[i-1]) {
i--;
break;
}
}
for (j = i; j <= size-1; j++) {
if (sort[j] > sort[i]) {
j--;
break;
}
if (j == size-1) {
break;
}
}
turn(i, j);
reverse(i+1, size - 1);
} else {
reverse(0, size-1);
}
};
inline permu operator++(int n) {
permu temp = *this;
nextper();
return temp;
};
inline permu& operator++() {
nextper();
return *this;
};
inline permu operator--(int n) {
permu temp = *this;
preper();
return temp;
};
inline permu& operator--() {
preper();
return *this;
};
permu& operator =(permu a) {
size = a.size;
for (int i = 0; i < size; ++i) {
sort[i] = a.sort[i];
}
return *this;
};
void reverse(int m, int n) {
if (m == n) return;
int a[100];
int i, j;
for (i = n, j = 0; i >= m; i--, j++) {
a[j] = sort[i];
}
for (i = m, j = 0; i <= n; i++, j++) {
sort[i] = a[j];
}
};
void nextper() { //++
if (size == 2) {
turn(0,1);
return;
}
bool isfin = 1;
int i, j;
for (i = 0; i < size - 1; i++) { // Judge if finished
if (sort[i] < sort[i + 1]) {
isfin = 0;
break;
}
}
if (!isfin) {
for (j = size - 1; j > 0; j--) {
if (sort[j] > sort[j - 1]) {
j--;
break;
}
}
for (i = j; i < size - 1; i++) {
if (sort[i] < sort[j]) {
i--;
// the position to be turned
break;
}
}
turn(i, j);
reverse(j+1, size - 1);
} else {
for (int t = 0; t < size; t++) {
sort[t] = t;
}
reverse(0, size-1);
}
};
friend ostream& operator<<(ostream& out, permu & a);
};
ostream& operator<<(ostream& out, permu &a) {
for (int i = 0; i < a.size; i++) {
out << a.sort[i] << " ";
}
return out;
}
#include <iostream>
#include <cstring>
using namespace std;
class permu {
private:
int sort[99999];
int size;
public:
permu() {
memset(sort, 0, sizeof(sort));
size = 0;
};
permu(int n) {
memset(sort, 0, sizeof(sort));
for (int i = 0; i < n; i++) {
sort[i] = i;
}
size = n;
}
permu(const permu& other) {
memset(sort, 0, sizeof(sort));
for (int i = 0; i < other.size; i++) {
sort[i] = other.sort[i];
}
size = other.size;
}
void turn (int n, int m) {
int temp = sort[n];
sort[n] = sort[m];
sort[m] = temp;
}
void preper() {
if (size == 2) {
turn(0,1);
return;
}
bool isfin = 1;
int i, j;
for (i = 0; i < size - 1; i++) { // Judge if finished
if (sort[i] > sort[i + 1]) {
isfin = 0;
break;
}
}
if (!isfin) {
for (i = size - 1; i >= 0; i--) {
if (sort[i] < sort[i-1]) {
i--;
break;
}
}
for (j = i; j <= size-1; j++) {
if (sort[j] > sort[i]) {
j--;
break;
}
if (j == size-1) {
break;
}
}
turn(i, j);
reverse(i+1, size - 1);
} else {
reverse(0, size-1);
}
};
inline permu operator++(int n) {
permu temp = *this;
nextper();
return temp;
};
inline permu& operator++() {
nextper();
return *this;
};
inline permu operator--(int n) {
permu temp = *this;
preper();
return temp;
};
inline permu& operator--() {
preper();
return *this;
};
permu& operator =(permu a) {
size = a.size;
for (int i = 0; i < size; ++i) {
sort[i] = a.sort[i];
}
return *this;
};
void reverse(int m, int n) {
if (m == n) return;
int a[100];
int i, j;
for (i = n, j = 0; i >= m; i--, j++) {
a[j] = sort[i];
}
for (i = m, j = 0; i <= n; i++, j++) {
sort[i] = a[j];
}
};
void nextper() { //++
if (size == 2) {
turn(0,1);
return;
}
bool isfin = 1;
int i, j;
for (i = 0; i < size - 1; i++) { // Judge if finished
if (sort[i] < sort[i + 1]) {
isfin = 0;
break;
}
}
if (!isfin) {
for (j = size - 1; j > 0; j--) {
if (sort[j] > sort[j - 1]) {
j--;
break;
}
}
for (i = j; i < size - 1; i++) {
if (sort[i] < sort[j]) {
i--;
// the position to be turned
break;
}
}
turn(i, j);
reverse(j+1, size - 1);
} else {
for (int t = 0; t < size; t++) {
sort[t] = t;
}
reverse(0, size-1);
}
};
friend ostream& operator<<(ostream& out, permu & a);
};
ostream& operator<<(ostream& out, permu &a) {
for (int i = 0; i < a.size; i++) {
out << a.sort[i] << " ";
}
return out;
}