#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> case1(int n, int m){
vector<pair<int, int>> v2;
vector<int> ans;
for (int i=m;i<m+n;i++)
v2.push_back({i % n, i});
sort(begin(v2), end(v2));
for (int i=0;i<n;i++)
ans.push_back(v2[i].second);
return ans;
}
vector<int> solve(int n, int m){
int b = 31 - __builtin_clz(n), b1 = m & (1<<b), b2 = (m + n - 1) & (1<<b);
int rem = n - (1<<b), all1 = (1<<b) - 1, r1 = (m + n) % (1<<b);
if ((1<<b) == n)
return case1(n, m);
vector<int> A, B;
if (b1 != 0 and b2 == 0){
A = solve((1<<b), m + rem);
B = solve(rem, m);
}
else if (b1 != 0 and b2 != 0){
A = solve((1<<b), m + rem - r1);
B = solve(rem, m);
for (int i=0;i<B.size();i++){
if ((B[i] & all1) < r1)
B[i] += (1<<b);
}
}
else if (b1 == 0 and b2 == 0){
A = solve((1<<b), m);
B = solve(rem, m + (1<<b));
for (int i=0;i<A.size();i++){
if ((A[i] & all1) < r1)
A[i] += (1<<b);
}
for (int i=0;i<B.size();i++){
if ((B[i] & all1) < r1)
B[i] -= (1<<b);
}
}
else if (b1 == 0 and b2 != 0){
A = solve((1<<b), m);
B = solve(rem, m + (1<<b));
}
A.insert(end(A), begin(B), end(B));
return A;
}
int main(){
int n, m;
cin>>n>>m;
vector<int> vec = solve(n, m);
for (int i=0;i<n;i++)
cout<<i<<' '<<vec[i]<<'\n';
}