Advertisement
AlexGo11

Untitled

Jan 4th, 2020
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.40 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. struct TreeNode {
  5.     long long x, y;
  6.     long long l, r;
  7.     long long val;
  8.     TreeNode(long long _x, long long _l, long long _r, long long _val) : x(_x), y(rand() << 15 + rand()), l(_l), r(_r) {}
  9.     TreeNode() : x(0), y(rand() << 15 + rand()), l(-1), r(-1) {}
  10. };
  11.  
  12. long long MOD = (1<<32);
  13. long long n, root_index = -1;
  14.  
  15. vector<TreeNode> tree;
  16.  
  17. void newNode(long long _x, long long _val) {
  18.     TreeNode el;
  19.     el.x = i;
  20.     el.val = ans;
  21.     tree.push_back(el);
  22. }
  23.  
  24. long long TreeMerge(long long L, long long R) {
  25.     if (L == -1) return R;
  26.     if (R == -1) return L;
  27.  
  28.     if (tree[L].y > tree[R].y) {
  29.         tree[L].r = TreeMerge(tree[L].r, R);
  30.         return L;
  31.     }
  32.    
  33.     tree[R].l = TreeMerge(L, tree[R].l);
  34.    
  35.     return R;
  36. }
  37.  
  38. pair <long long, long long> TreeSplit(long long p1, long long x) {
  39.     if (p1 == -1) return {-1, -1};
  40.     if (tree[p1].x >= x) {
  41.         pair <long long, long long> t = TreeSplit(tree[p1].l, x);
  42.         tree[p1].l = t.second;
  43.         return {t.first, p1};
  44.     }
  45.     pair <long long, long long> t = TreeSplit(tree[p1].r, x);
  46.     tree[p1].r = t.first;
  47.     return {p1, t.second};
  48. }
  49.  
  50. pair <bool, long long> TreeExist(long long p1, long long x) {
  51.     if (p1 == -1) return {false, -1};
  52.     if (tree[p1].x == x) return {true, tree[p1].val};
  53.     if (tree[p1].x >= x) return TreeExist(tree[p1].l, x);
  54.     return TreeExist(tree[p1].r, x);
  55. }
  56.  
  57. long long TreeBuild(long long i) {
  58.     pair <bool, long long> val = TreeExist(root_index, i);
  59.     if (val.first) return val.second;
  60.     if (i % 2 == 0) {
  61.         long long ans = (TreeBuild(i - 1) + TreeBuild(i - 3)) % MOD;
  62.         newNode(i, ans);
  63.         pair <long long, long long> t = TreeSplit(root_index, i - 1);
  64.         root_index = TreeMerge(t.first, TreeMerge(tree.size() - 1, t.second));
  65.         return ans;
  66.     }
  67.     long long ans = (TreeBuild(6 * i / 7) + TreeBuild(2 * i / 3)) % MOD;
  68.     newNode(i, ans);
  69.     pair <long long, long long> t = TreeSplit(root_index, i - 1);
  70.     root_index = TreeMerge(t.first, TreeMerge(tree.size() - 1, t.second));
  71.     return ans;
  72. }
  73.  
  74. int main() {
  75.     freopen("function.in", "r", stdin);
  76.     freopen("function.out", "w", stdout);
  77.     cin >> n;
  78.     for (long long i = 0; i <= 2; ++i) {
  79.         newNode(i, 1);
  80.         root_index = TreeMerge(root_index, tree.size() - 1);
  81.     }
  82.     cout << TreeBuild(n);
  83.     return 0;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement