Advertisement
Guest User

A

a guest
May 20th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.97 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <climits>
  6.  
  7. template<class T>
  8. class vector {
  9. public:
  10.     explicit vector() : buffer(nullptr), size(0) {};
  11.     explicit vector(int size);
  12.     explicit vector(int size, T value);
  13.     vector(const vector& other);
  14.     vector(vector&& other);
  15.     vector& operator=(const vector& other);
  16.     vector& operator=(vector&& other);
  17.     ~vector();
  18.  
  19.     T& operator[](int index) const { return buffer[index]; };
  20.  
  21.     void resize(int new_size);
  22.     int get_size() const { return size; };
  23. private:
  24.     T* buffer;
  25.     int size;
  26. };
  27.  
  28. template<class T>
  29. vector<T>::vector(int size) : size(size) {
  30.     buffer = new T[size];
  31. }
  32.  
  33. template<class T>
  34. vector<T>::vector(int size, T value) : size(size) {
  35.     buffer = new T[size];
  36.     for (int i = 0; i < size; ++i)
  37.         buffer[i] = value;
  38. }
  39.  
  40. template<class T>
  41. vector<T>::vector(const vector& other) : size(other.size) {
  42.     delete[] buffer;
  43.     buffer = new T[size];
  44.     for (int i = 0; i < size; ++i) {
  45.         buffer[i] = other.buffer[i];
  46.     }
  47. }
  48.  
  49. template<class T>
  50. vector<T>::vector(vector&& other) : size(0), buffer(nullptr) {
  51.     std::swap(buffer, other.buffer);
  52.     std::swap(size, other.size);
  53. }
  54.  
  55. template<class T>
  56. vector<T>& vector<T>::operator=(const vector& other) {
  57.     size = other.size;
  58.     delete[] buffer;
  59.     buffer = new T[size];
  60.     for (int i = 0; i < size; ++i) {
  61.         buffer[i] = other.buffer[i];
  62.     }
  63.     return *this;
  64. }
  65.  
  66. template<class T>
  67. vector<T>& vector<T>::operator=(vector&& other) {
  68.     std::swap(buffer, other.buffer);
  69.     std::swap(size, other.size);
  70.     return *this;
  71. }
  72.  
  73. template<class T>
  74. vector<T>::~vector()
  75. {
  76.     delete[] buffer;
  77. }
  78.  
  79. template<class T>
  80. void vector<T>::resize(int new_size) {
  81.     T* new_buffer = new T[new_size];
  82.     for (int i = 0; i < size; ++i) {
  83.         new_buffer[i] = buffer[i];
  84.     }
  85.     size = new_size;
  86.     delete[] buffer;
  87.     buffer = new_buffer;
  88. }
  89.  
  90. struct node {
  91.     int max_pref;
  92.     int max_suf;
  93.     int sum;
  94.     int max_sum;
  95.     node(int m_p, int m_sf, int s, int m_s) : max_pref(m_p), max_suf(m_sf), sum(s), max_sum(m_s) {}
  96.     node(int v) : max_pref(v), max_suf(v), sum(v), max_sum(v) {}
  97.     node() : max_pref(INT_MIN), max_suf(INT_MIN), sum(0), max_sum(INT_MIN) {}
  98. };
  99.  
  100. class SegmentTree {
  101. public:
  102.     explicit SegmentTree(const vector<int>& arr);
  103.     node FindMaxSubsegment(int l, int r, int v, int aim_l, int aim_r);
  104. private:
  105.     vector<node> segment_tree;
  106.     node make_node(const node& l, const node& r);
  107.     int size;
  108. };
  109.  
  110. node SegmentTree::make_node(const node& l, const node& r) {
  111.     node new_node;
  112.     new_node.max_pref = std::max(l.max_pref, l.sum + r.max_pref);
  113.     new_node.max_suf = std::max(r.max_suf, r.sum + l.max_suf);
  114.     new_node.sum = l.sum + r.sum;
  115.     new_node.max_sum = std::max(std::max(l.max_sum, r.max_sum), l.max_suf + r.max_pref);
  116.     return new_node;
  117. }
  118.  
  119. SegmentTree::SegmentTree(const vector<int>& arr) : size(arr.get_size()) {
  120.     int n = std::pow(2, std::ceil(std::log2(size)));
  121.     segment_tree = vector<node>(n * 2 - 1, node());
  122.     for (int i = n - 1; i < n + size - 1; ++i)
  123.         segment_tree[i] = node(arr[i - n + 1]);
  124.     for (int i = n - 2; i >= 0; --i)
  125.         segment_tree[i] = make_node(segment_tree[2 * i + 1], segment_tree[2 * i + 2]);
  126. }
  127.  
  128. node SegmentTree::FindMaxSubsegment(int v, int l, int r, int aim_l, int aim_r) {
  129.     if (aim_l == l && aim_r == r)
  130.         return segment_tree[v];
  131.     int mid = (aim_l + aim_r) / 2;
  132.     if (l > mid)
  133.         return FindMaxSubsegment(2 * v + 2, l, r, mid + 1, aim_r);
  134.     if (r <= mid)
  135.         return FindMaxSubsegment(2 * v + 1, l, r, aim_l, mid);
  136.     return make_node(
  137.         FindMaxSubsegment(2 * v + 1, l, mid, aim_l, mid),
  138.         FindMaxSubsegment(2 * v + 2, mid + 1, r, mid + 1, aim_r)
  139.     );
  140. }
  141.  
  142. int main() {
  143.     int n, sum_m = 0;
  144.     vector<int> ans(0);
  145.     while (std::cin >> n) {
  146.         int m;
  147.         std::cin >> m;
  148.         vector<int> arr(n);
  149.         for (int i = 0; i < n; ++i) {
  150.             int a;
  151.             std::cin >> a;
  152.             arr[i] = a;
  153.         }
  154.         ans.resize(sum_m + m);
  155.         SegmentTree tree(arr);
  156.         for (int i = sum_m; i < sum_m + m; ++i) {
  157.             int a, b;
  158.             std::cin >> a >> b;
  159.             node nd = tree.FindMaxSubsegment(0, a - 1, b - 1, 0, std::pow(2, std::ceil(std::log2(n))) - 1);
  160.             ans[i] = nd.max_sum;
  161.         }
  162.         sum_m += m;
  163.     }
  164.     for (int i = 0; i < sum_m; ++i) {
  165.         std::cout << ans[i] << std::endl;
  166.     }
  167.     return 0;
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement