#include <bits/stdc++.h>

using namespace std;

#define int ll

#define rep(i, a, b) for (int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int) (x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;

const int inf = 1e18 + 1e6;

int po(int a, int b) {
    __int128 s = 1;
    rep(i, 0, b) {
        s *= a;
        if (s >= inf) {
            return inf;
        }
    }
    return int(s);
}

void solve() {
    int n, k; cin >> n >> k;
    --k;

    vi p(n);
    rep(i, 0, n) {
        p[i] = po(2, i);
    }

    set<int> q;
    rep(i, 1, n) {
        q.insert(i);
    }

    vi a;

    if (k >= p[n - 2]) {
        // first is n
        k -= p[n - 2];
        a.push_back(n);
        for (int i = 1; ; ++i) {
            for (int j = 1; j < a[i - 1]; ++j) {
                int x = (j <= 2 ? 1 : p[j - 2]);
                if (k < x) {
                    a.push_back(j);
                    q.erase(j);
                    break;
                } else {
                    k -= x;
                }
            }
            if (a[i] == 1) {
                break;
            }
        }
        for (int x : q) {
            a.push_back(x);
        }
    } else {
        // last is n
        for (int i = 0; ; ++i) {
            for (int j = 1; j < (i - 1 >= 0 ? a[i - 1] : n); ++j) {
                int x = (j <= 2 ? 1 : p[j - 2]);
                if (k < x) {
                    a.push_back(j);
                    q.erase(j);
                    break;
                } else {
                    k -= x;
                }
            }
            if (a[i] == 1) {
                break;
            }
        }
        for (int x : q) {
            a.push_back(x);
        }
        a.push_back(n);
    }
    for (int x : a) {
        cout << x << " ";
    }
    cout << "\n";
}

signed main() {
    ios::sync_with_stdio(false); cin.tie(nullptr);
    
    solve();

    return 0;
}