Advertisement
Guest User

Untitled

a guest
May 20th, 2018
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.22 KB | None | 0 0
  1. /*ООО "Новые Железные Дороги" поручило вам разработать систему
  2. бронирования билетов на новый маршрут поезда дальнего следования.
  3. Маршрут проходит через N станций, занумерованных от 0 до N-1.
  4. Вместимость поезда ограничена.
  5. В систему бронирования последовательно приходят запросы от
  6. пассажиров с указанием номера начальной и конечной станции,
  7. а также количество билетов, которые пассажир хочет приобрести.
  8. Требуемая скорость обработки каждого запроса - .*/
  9. #include <iostream>
  10. #include <vector>
  11. #include <cmath>
  12. #include <utility>
  13. #include <algorithm>
  14.  
  15. using namespace std;
  16.  
  17. class SegmentTree {
  18. public:
  19. SegmentTree(const vector<int>& mas, const int N);
  20.  
  21. void build(const vector<int>& mas);
  22. void update(int v, int tl, int tr, int a, int b, int data);
  23. int segment_max(int v, int tl, int tr, int a, int b);
  24. int get_size();
  25. private:
  26. int size_num = 0;
  27. vector<pair<int, int>> tree;
  28. };
  29.  
  30. int main() {
  31. int n = 0;
  32. cin >> n;
  33.  
  34. vector<int> tickets(n);
  35. for (int i = 0; i < n - 1; ++i) {
  36. int tmp = 0;
  37. cin >> tmp;
  38. tickets[i] = tmp;
  39. }
  40.  
  41. int capacity = 0;
  42. cin >> capacity;
  43.  
  44. SegmentTree tree(tickets, n);
  45. tree.build(tickets);
  46.  
  47. int M = 0;
  48. cin >> M;
  49. for (int i = 0; i < M; ++i) {
  50. int tmp1 = 0;
  51. int tmp2 = 0;
  52. int tmp3 = 0;
  53. cin >> tmp1 >> tmp2 >> tmp3;
  54.  
  55. if (tree.segment_max(0, 0, tree.get_size() - 1, tmp1, tmp2 - 1) >(capacity - tmp3)) {
  56. cout << i << " ";
  57. }
  58. else {
  59. tree.update(0, 0, tree.get_size() - 1, tmp1, tmp2 - 1, tmp3);
  60. }
  61. }
  62. }
  63.  
  64. SegmentTree::SegmentTree(const vector<int>& mas, const int N) {
  65. size_num = 1 << (int)ceil(log2(N));
  66. tree.assign(2 * size_num - 1, make_pair(0, 0));
  67. }
  68.  
  69. void SegmentTree::build(const vector<int>& mas) {
  70. for (int i = 0; i < mas.size(); ++i) {
  71. tree[(2 * size_num - 1) / 2 + i].first = mas[i];
  72. }
  73. for (int i = (2 * size_num - 1) / 2 - 1; i >= 0; i--) {
  74. tree[i].first = max(tree[2 * i + 1].first, tree[2 * i + 2].first);
  75. }
  76. }
  77.  
  78. void SegmentTree::update(int v, int tl, int tr, int a, int b, int data) {
  79. if (a > b) {
  80. return;
  81. }
  82. else if (b == tr && a == tl) {
  83. tree[v].second += data;
  84. return;
  85. }
  86. else {
  87. int tm = tl + (tr - tl) / 2;
  88. update(2 * v + 1, tl, tm, a, min(b, tm), data);
  89.  
  90. update(2 * v + 2, tm + 1, tr, max(a, tm + 1), b, data);
  91.  
  92. tree[v].first = max(tree[2 * v + 1].first + tree[2 * v + 1].second, tree[2 * v + 2].first + tree[2 * v + 2].second);
  93. }
  94. }
  95.  
  96. int SegmentTree::segment_max(int v, int tl, int tr, int a, int b) {
  97. if (a > b) {
  98. return 0;
  99. }
  100. else if (a == tl && b == tr) {
  101. return tree[v].first + tree[v].second;
  102. }
  103. else {
  104. int tm = tl + (tr - tl) / 2;
  105. int left_max = segment_max(2 * v + 1, tl, tm, a, min(tm, b));
  106. int right_max = segment_max(2 * v + 2, tm + 1, tr, max(tm + 1, a), b);
  107. int res = max(left_max, right_max) + tree[v].second;
  108. return res;
  109. }
  110. }
  111.  
  112. int SegmentTree::get_size() {
  113. return size_num;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement