Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.61 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <math.h>
  4. #include <random>
  5.  
  6. using namespace std;
  7.  
  8. struct Node {
  9.     long long x, y;
  10.     long long sum = 0;
  11.     Node *left, *right;
  12. }; //+
  13.  
  14. Node * root = nullptr;
  15. long long n, x, y;
  16. char c;
  17. long long result = 0;
  18. long long a[20000000];
  19.  
  20. //написать все связанное с суммой
  21. void rangeCalc(Node *node) {
  22.     if (node == nullptr)
  23.         return;
  24.     long long w = node->right == nullptr ? 0 : node->right->sum;
  25.     w += node->left == nullptr ? 0 : node->left->sum;
  26.     node->sum = w + node->x;
  27. } //+
  28.  
  29. bool contains(Node *node, long long e) {
  30.     if (node == nullptr)
  31.         return false;
  32.     if (e == node->x)
  33.         return true;
  34.     if (e > node->x) {
  35.         return contains(node->right, e);
  36.     }
  37.     else {
  38.         return contains(node->left, e);
  39.     }
  40.     //to->y = node->y;
  41. } //+
  42.  
  43. Node * next(Node *node, long long e) {
  44.     Node * current = node, *successor = nullptr;
  45.     while (current != nullptr) {
  46.         if (current->x > e) {
  47.             successor = current;
  48.             current = current->left;
  49.         } else
  50.             current = current->right;
  51.     }
  52.     if (successor == nullptr) {
  53.         Node *to = new Node();
  54.         to->x = INT64_MIN;
  55.         return to;
  56.     }
  57.     return successor;
  58. }
  59.  
  60. Node * prev(Node *node, long long e) {
  61.     Node * current = node, *predecessor = nullptr;
  62.     while (current != nullptr) {
  63.         if (current->x < e) {
  64.             predecessor = current;
  65.             current = current->right;
  66.         } else
  67.             current = current->left;
  68.     }
  69.     if (predecessor == nullptr) {
  70.         Node *to = new Node();
  71.         to->x = INT64_MAX;
  72.         return to;
  73.     }
  74.     return predecessor;
  75. } //+
  76.  
  77. Node * merge(Node *A, Node* B) {
  78.     if (A == nullptr) {
  79.         rangeCalc(A);
  80.         rangeCalc(B);
  81.         return B;
  82.     } //+
  83.     if (B == nullptr) {
  84.         rangeCalc(A);
  85.         rangeCalc(B);
  86.         return A;
  87.     } //+
  88.     if (A->y < B->y) {
  89.         A->right = merge(A->right, B);
  90.         rangeCalc(B);
  91.         rangeCalc(A);
  92.         return A;
  93.     } //+
  94.     else {
  95.         B->left = merge(A, B->left);
  96.         rangeCalc(A);
  97.         rangeCalc(B);
  98.         return B;
  99.     } //+
  100. }
  101.  
  102. pair<Node *, Node *> split(Node *A, long long e) {
  103.     if (A == nullptr) {
  104.         return make_pair(nullptr, nullptr);
  105.     }
  106.     /*if (A->x == x) {
  107.         Node * res1 = merge(A, A->right);
  108.         rangeCalc(res1);
  109.         pair<Node *, Node *> res = make_pair(A->left, res1);
  110.         rangeCalc(A);
  111.         return  make_pair(res.first, res.second);
  112.     }*/
  113.     if (A->x < e) {
  114.         pair<Node *, Node *> res = split(A->right, e);
  115.         rangeCalc(res.second);
  116.         rangeCalc(res.first);
  117.         A->right = res.first;
  118.         rangeCalc(A->right);
  119.         rangeCalc(A);
  120.         return make_pair(A, res.second);
  121.     }
  122.     else {
  123.         pair<Node *, Node *> res = split(A->left, e);
  124.         rangeCalc(res.first);
  125.         rangeCalc(res.second);
  126.         A->left = res.second;
  127.         rangeCalc(A->left);
  128.         rangeCalc(A);
  129.         return make_pair(res.first, A);
  130.     }
  131. }
  132.  
  133. Node * insert(Node * A, Node * nd) {
  134.     rangeCalc(A);
  135.     pair<Node *, Node *> res = split(A, nd->x);
  136.     rangeCalc(res.first);
  137.     rangeCalc(res.second);
  138.     Node * T = merge(res.first, nd);
  139.     rangeCalc(T);
  140.     rangeCalc(res.second);
  141.     A = merge(T, res.second);
  142.     rangeCalc(A);
  143.     return A;
  144. }
  145.  
  146. /*pair<Node *, long long> sum(Node *node, long long l, long long r) { //[l, r)
  147.     long long leftSum = 0;
  148.     long long rightSum = 0;
  149.     long long nodeRes = 0;
  150.     if (node == nullptr) {
  151.         return make_pair(node, 0);
  152.     }
  153.     if (node->x >= l && node->x < r) { //+
  154.         nodeRes = node->x;
  155.     }
  156.     if (node->leftBound >= r || node->rightBound <= l) { //+
  157.         rangeCalc(node);
  158.         return make_pair(node, 0);
  159.     }
  160.     if (node->leftBound >= l && node->rightBound <= r) {
  161.         rangeCalc(node);
  162.         long long w = node->right == nullptr ? 0 : node->right->sum;
  163.         w += node->left == nullptr ? 0 : node->left->sum;
  164.         node->sum = w + node->x;
  165.         return make_pair(node, w + node->x);
  166.     }
  167.     if (node->left != nullptr) {
  168.         //pair<Node *, long long> resu = sum(node->left, max(l, node->leftBound), min(node->x, r));
  169.         pair<Node *, long long> resu = sum(node->left, max(l, node->left->leftBound), min(node->left->rightBound, r));
  170.         node->left = resu.first;
  171.         rangeCalc(node->left);
  172.         leftSum = resu.second;
  173.     }
  174.     if (node->right != nullptr) {
  175.         //pair<Node *, long long> resu = sum(node->right, max(l, node->x), min(r, node->rightBound));
  176.         pair<Node *, long long> resu = sum(node->right, max(l, node->right->leftBound), min(node->right->rightBound, r));
  177.         node->right = resu.first;
  178.         rangeCalc(node->right);
  179.         rightSum = resu.second;
  180.     }
  181.     rangeCalc(node);
  182.     return make_pair(node, leftSum + rightSum + nodeRes);
  183. }*/
  184.  
  185. pair<Node *, long long> sum(Node *node, long long l, long long r) {
  186.     pair<Node *, Node *> res = split(node, l);
  187.     rangeCalc(res.first);
  188.     rangeCalc(res.second);
  189.     pair<Node *, Node *> res1 = split(res.second, r + 1);
  190.     rangeCalc(res1.first);
  191.     rangeCalc(res1.second);
  192.     long long ans = res1.first == nullptr ? 0 : res1.first->sum;
  193.     Node * back = merge(res1.first, res1.second);
  194.     rangeCalc(back);
  195.     node = merge(res.first, back);
  196.     rangeCalc(node);
  197.     return make_pair(node, ans);
  198. }
  199.  
  200. int main() {
  201.     cin >> n;
  202.     long long E = 1e9;
  203.     random_device rd;
  204.     mt19937 mersenne(rd());
  205.     result = 0;
  206.     for (int i = 0; i < n; i++) { //+
  207.         cin >> c;
  208.         cin >> x;
  209.         //if (c == '+' && next(root, (x + result - 1))->x != ((x + result) % 1000000000)) {
  210.         if (c == '+') {
  211.             if (!contains(root, (x + result + E) % E)) {
  212.                 Node *to = new Node();
  213.                 to->x = (x + result + E) % E; //+
  214.                 to->sum = to->x; //+
  215.                 to->y = mersenne() % 10000000;
  216.                 while (a[to->y] != 0) {
  217.                     to->y = mersenne() % 10000000;
  218.                 }
  219.                 a[to->y]++;
  220.                 root = insert(root, to);
  221.                 rangeCalc(root);
  222.             }
  223.             result = 0;
  224.         }
  225.         else if (c == '?') {
  226.             cin >> y;
  227.             //y++;
  228.             x %= (E);
  229.             y %= (E);
  230.             pair<Node *, long long> res1 = sum(root, x, y);
  231.             root = res1.first;
  232.             rangeCalc(root);
  233.             result = res1.second;
  234.             cout << result << endl;
  235.         }
  236.     }
  237.     return 0;
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement