Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.51 KB | None | 0 0
  1. #include <vector>
  2. #include <utility>
  3. #include <fstream>
  4. #include <iostream>
  5.  
  6. struct Tree {
  7. std::vector<std::pair<int, int>> Data;
  8. Tree(std::vector<int> &inp) {
  9. unsigned t = 1;
  10. for (; t <= inp.size(); t*=2);
  11. t*=4;
  12. Data = std::vector<std::pair<int, int>>(t, {0, 0});
  13. BuildTree(1, 1, inp.size(), inp);
  14. }
  15. int sum(int x, int len) {
  16. return x * len + len*(len-1)/2;
  17. }
  18. void push(int vr, int tl, int tr) {
  19. if (Data[vr].second == 0) {
  20. return;
  21. }
  22. int len = tr - tl + 1;
  23. int mid = (tl + tr)/2;
  24. int l1 = mid - tl + 1;
  25. Data[2*vr].first = sum(Data[vr].second, l1);
  26. Data[2*vr + 1].first = sum(Data[vr].second + l1, len - l1);
  27. Data[2*vr].second = Data[vr].second;
  28. Data[2*vr+1].second = Data[vr].second + l1;
  29. Data[vr].second = 0;
  30. return;
  31. }
  32. int BuildTree(int vr, int tl, int tr, std::vector<int> &inp) {
  33. if (tl > tr) {
  34. return 0;
  35. }
  36. if (tl == tr) {
  37. Data[vr].first = inp[tl-1];
  38. return Data[vr].first;
  39. }
  40. int mid = (tl + tr)/2;
  41. Data[vr].first = BuildTree(vr*2, tl, mid, inp) + BuildTree(vr*2 + 1, mid + 1, tr, inp);
  42. return Data[vr].first;
  43. }
  44. int Get(int vr, int tl, int tr, int l_, int r_) {
  45. if ((l_>r_)||(tl > tr)) {
  46. return 0;
  47. }
  48. push(vr, tl, tr);
  49. if (tl == tr) {
  50. return Data[vr].first;
  51. }
  52. if ((tl == l_) && (tr == r_)) {
  53. return Data[vr].first;
  54. }
  55. int Mid = (tl + tr) / 2;
  56. return Get(2 * vr, tl, Mid, l_, std::min(r_, Mid)) +
  57. Get(2 * vr + 1, Mid + 1, tr, std::max(l_, Mid + 1), r_);
  58. }
  59. void update(int vr, int tl, int tr, int l_, int r_, int var) {
  60. if ((l_>r_)||(tl > tr)) {
  61. return;
  62. }
  63.  
  64. push(vr, tl, tr);
  65. if ((tl == tr) || ((tl == l_) && (tr == r_))) {
  66. Data[vr].first = sum(var, tr - tl + 1);
  67. Data[vr].second = var;
  68. push(vr, tl, tr);
  69. return;
  70. }
  71. int Mid = (tl + tr)/2;
  72. if (r_ <= Mid) {
  73. update(2 * vr, tl, Mid, l_, r_, var);
  74. } else if (l_ >= Mid + 1) {
  75. update(2 * vr + 1, Mid + 1, tr, l_, r_, var);
  76. } else {
  77. update(2 * vr, tl, Mid, l_, Mid, var);
  78. update(2 * vr + 1, Mid + 1, tr, Mid + 1, r_, var + Mid - l_ + 1);
  79. }
  80. Data[vr].first = Data[2*vr].first + Data[2*vr+1].first;
  81. return;
  82. }
  83.  
  84. void DebugPrint() {
  85. for(unsigned int i=0; i<Data.size();++i) {
  86. std::cout << Data[i].first << ' ';
  87. }
  88. std::cout << '\n';
  89. for(unsigned int i=0; i<Data.size();++i) {
  90. std::cout << Data[i].second << ' ';
  91. }
  92. std::cout << "\n\n";
  93. }
  94.  
  95. };
  96.  
  97. int main() {
  98. std::fstream fi, fo;
  99. int op, l, r, n, m;
  100. fi.open("input.txt", std::fstream::in);
  101. fo.open("output.txt", std::fstream::out);
  102. fi >> n;
  103. std::vector<int> inp(n);
  104. for(int i = 0; i<n; ++i) {
  105. fi >> inp[i];
  106. }
  107. Tree Data(inp);
  108. //Data.DebugPrint();
  109.  
  110. fi >> m;
  111. for(int i=0; i<m; ++i) {
  112. fi >> op >> l >> r;
  113. if (op == 1) {
  114. fo << Data.Get(1, 1, n, l, r) << '\n';
  115. } else {
  116. Data.update(1, 1, n, l, r, 1);
  117. }
  118. }
  119.  
  120. //Data.DebugPrint();
  121.  
  122. fi.close();
  123. fo.close();
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement