#include <iostream>
using namespace std;
// pentru a nu mai scrie mereu "std::" care sa preceada "cin", "cout", ..
int main(){
int aux,i,j,k,n,v[20];
cout << "Dati n= " << "\n";
cin >> n ;
// Atribuirea initiala v[i]=i si scrierea primei permutari : 1 2 3 ... n
// Apoi trece pe linia urmatoare
for(i=0; i<=n; i++) {v[i]=i; if (i>0) cout << v[i];} cout << "\n";
// Incepe secventa principala a programului
do {
k=n;
while (v[k-1] > v[k]) k--;
k--; // Am gasit pozitia k, unde sirul pornit din dreapta coboara
if (k>0) {
j=n;
while (v[k]>v[j]) j--;
// ma intereseaza pozitia nr. j
// Adica : de la k+1 incolo caut cel mai mic v[j] dar mai mare decat v[k]
aux=v[k]; v[k]=v[j]; v[j]=aux; // schimb v[k] cu v[j]
for (i=k+1; i<=(n+k)/2; i++){aux=v[i]; v[i]=v[n+k+1-i]; v[n+k+1-i]=aux;}
// schimb v[i] cu v[n+k+1-i]
// Adica sirul v[k+1], v[k+2], ... , v[n] il intorc invers :)
for(i=1; i<=n; i++) {cout << v[i];} cout << "\n";
// tiparesc urmatoarea permutare si trec pe linie noua
}
} while (k > 0);
return 0;
}