Advertisement
AlexGo11

Untitled

Jan 4th, 2020
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.57 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 value;
  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. const long long MOD = pow(2, 32);
  13. long long n, root_index = -1;
  14. vector <TreeNode> tree;
  15.  
  16. long long TreeMerge(long long L, long long R) {
  17.     if (L == -1) return R;
  18.     if (R == -1) return L;
  19.     if (tree[L].y > tree[R].y) {
  20.         tree[L].r = TreeMerge(tree[L].r, R);
  21.         return L;
  22.     } else {
  23.         tree[R].l = TreeMerge(L, tree[R].l);
  24.         return R;
  25.     }
  26. }
  27.  
  28. pair <long long, long long> TreeSplit(long long p1, long long x) {
  29.     if (p1 == -1) return {-1, -1};
  30.     if (tree[p1].x >= x) {
  31.         pair<long long, long long> t = TreeSplit(tree[p1].l, x);
  32.         tree[p1].l = t.second;
  33.         return {t.first, p1};
  34.     } else {
  35.         pair<long long, long long> t = TreeSplit(tree[p1].r, x);
  36.         tree[p1].r = t.first;
  37.         return {p1, t.second};
  38.     }
  39. }
  40.  
  41. pair<bool, long long> TreeExist(long long p1, long long x) {
  42.     if (p1 == -1) return {false, -1};
  43.     if (tree[p1].x == x) return {true, tree[p1].value};
  44.     if (tree[p1].x >= x) return TreeExist(tree[p1].l, x);
  45.     return TreeExist(tree[p1].r, x);
  46. }
  47.  
  48. long long TreeBuild(long long i) {
  49.     pair <bool, long long> value = TreeExist(root_index, i);
  50.     if (value.first) return value.second;
  51.     if (i % 2 == 0) {
  52.         long long ans = (TreeBuild(i - 1) + TreeBuild(i - 3)) % MOD;
  53.        
  54.         TreeNode el;
  55.         el.x = i;
  56.         el.value = ans;
  57.         tree.push_back(el);
  58.        
  59.         pair<long long, long long> t = TreeSplit(root_index, i - 1);
  60.         root_index = TreeMerge(t.first, TreeMerge(tree.size() - 1, t.second));
  61.         return ans;
  62.     } else {
  63.         long long ans = (TreeBuild(6 * i / 7) + TreeBuild(2 * i / 3)) % MOD;
  64.        
  65.         TreeNode el;
  66.         el.x = i;
  67.         el.value = ans;
  68.         tree.push_back(el);
  69.        
  70.         pair<long long, long long> t = TreeSplit(root_index, i - 1);
  71.         root_index = TreeMerge(t.first, TreeMerge(tree.size() - 1, t.second));
  72.         return ans;
  73.     }
  74. }
  75.  
  76. int main() {
  77.     freopen("function.in", "r", stdin);
  78.     freopen("function.out", "w", stdout);
  79.     cin >> n;
  80.     for (long long i = 0; i <= 2; ++i) {
  81.        
  82.         TreeNode el;
  83.         el.x = i;
  84.         el.value = 1;
  85.         tree.push_back(el);
  86.        
  87.         root_index = TreeMerge(root_index, tree.size() - 1);
  88.     }
  89.     cout << TreeBuild(n);
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement