#include using namespace std; #define mk make_pair #define st first #define nd second typedef long long lld; typedef __int128_t int128; int S; int generateTabacco(int exp, const int& start, vector >& toPick, vector, int> >& toDo) { // cout << "EXP: " << exp << '\n'; if (!exp) { toDo.push_back(mk(mk(0, start), 1)); // cout << 0 << ' ' << start << ' ' << 1 << '\n'; toPick.push_back(mk(0, start)); return start + 1; } ++exp; for (int i = 0; i < exp; i++) { int end = 2 * exp - 2 * i - 1; toDo.push_back(mk(mk(i, start + i), 1)); // cout << i << ' ' << start + i << ' ' << 1 << '\n'; for (int j = 1; j < end; j++) { toDo.push_back(mk(mk(i, start + i + j), 0)); // cout << i << ' ' << start + i + j << ' ' << 0 << '\n'; } toDo.push_back(mk(mk(i, start + i + end), 1)); // cout << i << ' ' << end + start + i << ' ' << 1 << '\n'; } --exp; int mid = start + exp; for (int i = -1; i >= exp - S; i--) { toDo.push_back(mk(mk(i, mid), 0)); toDo.push_back(mk(mk(i, mid + 1), 0)); // cout << i << ' ' << mid << ' ' << 0 << '\n'; // cout << i << ' ' << mid + 1 << ' ' << 0 << '\n'; } toPick.push_back(mk(exp - S, mid)); return start + 2 * exp + 2; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); lld N; cin >> N; if (!N) { cout << "0 0\n"; return 0; } int exp = 0, start = -1000000; vector bits; while (N) { if (N & 1) { bits.push_back(exp); } ++exp; N >>= 1; } // cout << "BITS: "; // for (int i = 0; i < bits.size(); i++) // cout << bits[i] << ' '; // cout << '\n'; S = exp - 1; vector, int> > toDo; vector > toPick; while (!bits.empty()) { start = 1 + generateTabacco(bits.back(), start, toPick, toDo); bits.pop_back(); } cout << toDo.size() << '\n'; for (pair, int>& i : toDo) cout << i.st.st << ' ' << i.st.nd << ' ' << i.nd << '\n'; cout << toPick.size() << ' ' << S << '\n'; for (pair& i : toPick) { cout << i.first << ' ' << i.second << '\n'; } return 0; }