Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- struct TreeNode {
- long long x, y;
- long long l, r;
- long long val;
- TreeNode(long long _x, long long _l, long long _r, long long _val) : x(_x), y(rand() << 15 + rand()), l(_l), r(_r) {}
- TreeNode() : x(0), y(rand() << 15 + rand()), l(-1), r(-1) {}
- };
- long long MOD = (1<<32);
- long long n, root_index = -1;
- vector<TreeNode> tree;
- void newNode(long long _x, long long _val) {
- TreeNode el;
- el.x = i;
- el.val = ans;
- tree.push_back(el);
- }
- long long TreeMerge(long long L, long long R) {
- if (L == -1) return R;
- if (R == -1) return L;
- if (tree[L].y > tree[R].y) {
- tree[L].r = TreeMerge(tree[L].r, R);
- return L;
- }
- tree[R].l = TreeMerge(L, tree[R].l);
- return R;
- }
- pair <long long, long long> TreeSplit(long long p1, long long x) {
- if (p1 == -1) return {-1, -1};
- if (tree[p1].x >= x) {
- pair <long long, long long> t = TreeSplit(tree[p1].l, x);
- tree[p1].l = t.second;
- return {t.first, p1};
- }
- pair <long long, long long> t = TreeSplit(tree[p1].r, x);
- tree[p1].r = t.first;
- return {p1, t.second};
- }
- pair <bool, long long> TreeExist(long long p1, long long x) {
- if (p1 == -1) return {false, -1};
- if (tree[p1].x == x) return {true, tree[p1].val};
- if (tree[p1].x >= x) return TreeExist(tree[p1].l, x);
- return TreeExist(tree[p1].r, x);
- }
- long long TreeBuild(long long i) {
- pair <bool, long long> val = TreeExist(root_index, i);
- if (val.first) return val.second;
- if (i % 2 == 0) {
- long long ans = (TreeBuild(i - 1) + TreeBuild(i - 3)) % MOD;
- newNode(i, ans);
- pair <long long, long long> t = TreeSplit(root_index, i - 1);
- root_index = TreeMerge(t.first, TreeMerge(tree.size() - 1, t.second));
- return ans;
- }
- long long ans = (TreeBuild(6 * i / 7) + TreeBuild(2 * i / 3)) % MOD;
- newNode(i, ans);
- pair <long long, long long> t = TreeSplit(root_index, i - 1);
- root_index = TreeMerge(t.first, TreeMerge(tree.size() - 1, t.second));
- return ans;
- }
- int main() {
- freopen("function.in", "r", stdin);
- freopen("function.out", "w", stdout);
- cin >> n;
- for (long long i = 0; i <= 2; ++i) {
- newNode(i, 1);
- root_index = TreeMerge(root_index, tree.size() - 1);
- }
- cout << TreeBuild(n);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement